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

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

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

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

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

  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

0 голосов
/ 13 мая 2018

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

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