PHP preg_replace — заменить все вхождения

#php #regex #preg-replace #repeat

#php #регулярное выражение #preg-заменить #повторить

Вопрос:

В настоящее время у меня есть этот фрагмент PHP, который заменяет / удаляет определенные шаблоны тегов HTML:

 $body = preg_replace('(<p></p>)', "", $body);
$body = preg_replace('(<div><br></div>)', "", $body);
$body = preg_replace('(<p><br></p>)', "", $body);
$body = preg_replace('(<p><ol>)', "<ol>", $body);
$body = preg_replace('(</ol></p>)', "</ol>", $body);
  

Однако это не удаляет все вхождения «шаблонов тегов», только первое.

Я видел несколько вопросов по SOF, которые относятся к такого рода проблемам, однако я не нашел ни одного, который полностью решил бы мою проблему.

Комментарии:

1. Похоже, вы ищете литералы. Почему вы используете preg_ вместо str_ ?

2. Вы пытаетесь удалить ненужные теги? Например, если ваш html-код имеет: <html>blabla<p></p> bleble</html>

Ответ №1:

Для замены всех вхождений известной строки было бы разумнее использовать str_replace(), поскольку вы точно знаете, что хотите заменить.

Ответ №2:

Нет причин, по которым preg_replace не удаляются все вхождения, поскольку по умолчанию выполняется глобальный поиск, и ваши шаблоны кажутся правильными. Посмотрите на результат вашей строки во второй раз, чтобы убедиться, что теги, которые не были удалены, действительно соответствуют шаблону (вероятно, это не так).

Однако, поскольку вы заменяете фиксированные подстроки, вам не нужно использовать регулярное выражение, более быстрый способ — использовать strtr :

 $trans = array('<p></p>'         => '',
               '<div><br></div>' => '',
               '<p><ol>'         => '<ol>',
               '</ol></p>'       => '</ol>');

$body = strtr($body, $trans);
  

Использование preg_replace будет необходимо, только если вы хотите иметь дело с необязательными необязательными пустыми символами. Другой способ, не всегда очень удобный, но надежный, заключается в использовании DOMDocument .