Регулярное выражение для сопоставления ВСЕХ экземпляров определенной строки между определенными тегами

Я пытаюсь сопоставить / заменить все экземпляры тега «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 ,

Любая помощь будет принята с благодарностью. Спасибо, парни!

-1

Решение

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

{c}(.*(<br>).*){\/c}
0

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

Регулярное выражение может соответствовать только одной строке за раз. Вам нужно сделать это в два этапа:

  1. Подходим шаблон (?<=\{c\}).*?(?=\{/c\}, Это вернет все между {c} а также {/c},

  2. использование 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;

DEMO

-1

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