regex - How do I use PHP preg_replace with the same pattern, when the word happens multiple times? -
sorry question horribly worded, have no thought how state question. easier me show code , explain.
i trying write function allow tagging of words. have database of words phone call glossary. want take big amount of text , multiple instance of [g]some word/words here[/g]. want replace <a href="viewglossary.php?word={word/words between [g][/g]}">{word/words between [g][/g]}</a>
here current function:
function getglossary($str) { $patterns = array(); $patterns[]='/\[g\](.*)\[\/g\]/'; $replacements = array(); $replacements[]='<a href="viewglossary.php?word=$1">$1</a>'; homecoming preg_replace($patterns, $replacements, $str); } echo getglossary($txt); if single instance of [g][/g] tag works.
$txt='what need know [g]beans[/g]'; this output
what need know <a href="viewglossary.php?word=beans">beans</a> however this
$txt='what need know [g]beans[/g] , [g]corn[/g]'; will output
what need know <a href="viewglossary.php?word=beans[/g] , [g]corn">beans[/g] , [g]corn</a> i sure have wrong in pattern. help appreciated.
you need create dot-star lazy: .*?
? maintain .* in check, .* eat characters final [/g] the * quantifier greedy, .* starts off matching characters in string end. backtracks far needed allow [/g] match (therefore, backtracks lastly [/g]). the ? makes quantifiers "lazy", match far needed rest of regex match. hence match first [/g]. modify regex so:
$pattern = "~\[g\](.*?)\[/g\]~"; note create regex easier read, have changed delimiter , unescaped forwards slash, there no need escapes slashes unless delimiter slash. mutual delimiters include ~, %, @, #... tildes beautiful. :)
reference
the many degrees of regex greed repetition star , plus php regex preg-replace
No comments:
Post a Comment