Я пытаюсь сопоставить / заменить все экземпляры тега «br», но только когда они окружены разделителями {c} {/ c}. Это шаблон регулярного выражения, который у меня есть сейчас:
/{c}.*(<br>).*{\/c}/mgsU
Проблема с тем, что у меня есть в настоящее время, состоит в том, что он соответствует только самому первому тегу и игнорирует остальные, если нет другого блока {c} {/ c}, где он делает то же самое. Это URL-адрес страницы regex101, которую я создал для тестирования: https://regex101.com/r/eVI53z/2
У него есть тестовая строка, и мой желаемый результат будет соответствовать строкам 2,3, концу 5, началу 6 перед тегом {/ c}, концу строки 12, трем тегам в строке 15 и середине строки 16 ,
Любая помощь будет принята с благодарностью. Спасибо, парни!
попробуй это:
{c}(.*(<br>).*){\/c}
Регулярное выражение может соответствовать только одной строке за раз. Вам нужно сделать это в два этапа:
Подходим шаблон (?<=\{c\}).*?(?=\{/c\}
, Это вернет все между {c}
а также {/c}
,
использование preg_match_all
с этой возвращенной строкой, чтобы найти все <br>
Строки в нем.
Если вы пытаетесь заменить исходную строку, вы можете использовать preg_replace_callback()
с первым шаблоном, затем используйте preg_replace()
или же str_replace()
в функции обратного вызова.
$str = '{c}
<br>
<br>
test
test<br>
<br>{/c}
<br>
test
test<br>
{c}
saddasda<br>
{/c}
{c}<br>test<br><br>{/c}
{c}<br>{/c}';
$new_str = preg_replace_callback('#(?<=\{c\}).*?(?=\{/c\})#s', function($matches) {
return str_replace("<br>", "[linebreak]", $matches[0]);
}, $str);
echo $new_str;