regex — PHP заменяет строку, используя перекрывающиеся регулярные выражения

Как заменить строку, используя перекрывающиеся регулярные выражения?

Здравствуйте! Я пытаюсь добавить HTML-теги в строку. Я использую функцию preg_replace (), но когда мои шаблоны в массиве перекрываются, preg_replace не работает.

$string = 'abc';
$patterns[0] = '/a/';
$patterns[1] = '/abc/';
$replacements[0] = '<b>$0</b>';
$replacements[1] = '<i>$0</i>';
echo preg_replace($patterns, $replacements, $string);

Это дает следующий результат:

<b>a</b>bc

Но я ожидал такой вывод:

<b><i>a</b>bc</i>

Кажется, что preg_replace берет первый шаблон и заменяет его первой заменой, а затем ищет второй шаблон, но ищет в модифицированный строка.
Я должен использовать функции, которые поддерживать регулярные выражения.

3

Решение

Это потому, что они работают не одновременно, а в цикле. И после первого выражения вы в конечном итоге <b>a</b>bc так что больше нет abc для второго выражения, чтобы соответствовать.

Это просто так. И это хорошо, потому что благодаря этому вы не заканчивается неправильной разметкой. Ты сможешь. Regex — это серьезная проблема с HTML или XML.

Используйте некоторый интерпретатор DOM и библиотеку, например PHP DOMDocument

1

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

Других решений пока нет …

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