php - regex in preg_match_all() doesn't work as expected -
i have following string:
"<h2>define vim greatest</h2> word processor, <h3>vi</h3>!".
i want select h2
, h3
following structure regex.
expected output be:
array( 0 => <h2>define vim greatviest</h2> 1 => <h3>vi</h3> )
so implement regular expression follow:
preg_match_all("/(?:<h2>|<h3>).*vi.*(?:<\/h2>|<\/h3>)/i", $input, $matches)
but instead of desirable result above, outputs following result.
current output:
array( 0 => <h2>define vim greatviest</h2> word prviocessor ever created <h3>vi</h3> )
how can change code/regex, tags in expected output above?
well problem is, first missing delimiters regex , second vi
case-sensitive, have add i
flag, case-insensitivity.
so code (just removed vi in regex , grab between h1-6
tags):
<?php $input = '"<h2>define vim greatest</h2> word processor, <h3>vi</h3>!".'; preg_match_all("/(?:<h[0-6]>).*?(?:<\/h[0-6]>)/", $input, $matches); print_r($matches); ?>
output:
array ( [0] => array ( [0] => <h2>define vim greatest</h2> [1] => <h3>vi</h3> ) )
edit:
as updated regex problem is, .*
greedy, means takes as can. make non-greedy have add ?
@ end. change .*
-> .*?
.
Comments
Post a Comment