regex — preg_replace_callback не работает в переполнении стека

$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"

Мне нужно конвертировать все \DIFaddbegin \DIFadd{test}\DIFaddend в \added{test},

Я старался

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

Но не повезло. Какой будет правильный шаблон для этого? И даже если строка содержит символ новой строки, шаблон должен работать.

1

Решение

Вам не нужен обратный звонок, используя preg_replace() хорошо для этой задачи. Чтобы сопоставить одну обратную косую черту, вам нужно дважды убрать ее значение \\\\, Чтобы сопоставить возможные пробелы между каждой подстрокой, вы можете использовать \s* значение пробела «ноль или более» раз.

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

Другие решения

Попробуй это:

$new_str = preg_replace("/\\\\DIFaddbegin \\\\DIFadd\{(.*)\}\\\\DIFaddend/s","\\added{\$1}",$str);
0

По вопросам рекламы [email protected]