Search code examples
phpregexpreg-replacepreg-replace-callback

preg_replace_callback not working in php


$str="Your LaTeX document can \DIFaddbegin \DIFadd{test}\DIFaddend be easily 
and the text can have multiple lines in it like this\DIFaddbegin \DIFadd{test2}
\DIFaddend"

I need to convert all \DIFaddbegin \DIFadd{test}\DIFaddend to \added{test}.

I tried

$o= preg_replace_callback('/\\DIFaddbegin\\s\DIFadd{(.*?)}\\DIFaddend/',
function($m) {return preg_replace('/$m[0]/','\added{$m[1]}',$m[0]);},$str);

But no luck. Which would be correct pattern for this? And also even if the string contains new line character the pattern should work.


Solution

  • You don't need a callback, using preg_replace() is fine for this task. To match a single backslash you need to double escape it meaning \\\\. To match possible whitespace between each substring, you can use \s* meaning whitespace "zero or more" times.

    $str = preg_replace('~\\\\DIFaddbegin\s*\\\\DIFadd({[^}]*})\s*\\\\DIFaddend~', '\added$1', $str);