Как убрать тег абзаца <p>со специальным словом в preg_replace? - PullRequest
1 голос
/ 14 мая 2019

Например, у меня есть следующий код:

$string = '<p>i need to go to my room</p><p>i don't need to go to school</p><p>i need to study everywhere</p>';

Теперь я хочу удалить абзац, содержащий слова «в школу».Вывод, который я хочу получить: <p> мне нужно идти в свою комнату </p><p> мне нужно учиться везде </p>

Как мне это сделать с preg_replace?

Ответы [ 2 ]

1 голос
/ 14 мая 2019
$result = preg_replace ( "<p[^<]*to school[^<]*<\/p>" , "" , $string);
echo $result;

Regex101


Примечание: у меня нет PHP для тестирования, но регулярное выражение должно работать, как проверено на Regex101.

1 голос
/ 14 мая 2019

Обратите внимание, что обычно зло и плохая практика использовать регулярные выражения для разбора HTML. Но, предполагая, что у вас есть только строка с набором тегов HTML <p> верхнего уровня, здесь можно использовать regex.

$string = "<p>i need to go to my room</p><p>i don't need to go to school</p><p>i need to study everywhere</p>";
$output = preg_replace("/<p>((?!<\/p>).)*\bto school\b.*?<\/p>/", "2000", $string);
echo $output;

Это выводит:

<p>i need to go to my room</p>2000<p>i need to study everywhere</p>

Вот объяснение регулярного выражения:

<p>            match an initial <p> tag
((?!<\/p>).)*  match any character, provided that we do not
               encounter a closing </p> tag

\bto school\b  match the literal text "to school"
.*?<\/p>       consume the remainder until the first closing </p>

Единственная, возможно, хитрая часть приведенного выше регулярного выражения:

((?!<\/p>).)*

Это закаленная точка, и она работает, применяя отрицательный прогноз (?!</p>) на каждом шаге, который соответствует любому символу. Это очень важно, потому что это гарантирует, что механизм регулярных выражений не будет случайно пересекать несколько тегов <p>, чтобы найти to school.

...