Как удалить тег абзаца <p>, содержащий специальное слово в preg_replace?

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

$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 ?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
374
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

$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.

это работа .. чтобы получить то, что я хочу, я просто меняю «2000» на пустое .. большое спасибо ..

oyotsuket 14.05.2019 08:07
$result = preg_replace ( "<p[^<]*to school[^<]*</p>" , "" , $string);
echo $result;

Регулярное выражение101


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

Что вы имеете в виду под "пустым результатом"?

virolino 14.05.2019 08:02

Я добавил «эхо», и теперь все должно быть в порядке. Или?

virolino 14.05.2019 08:40

по-прежнему пустой результат.. но я пытался добавить / до <p и после /p>.. теперь это работает.. большое спасибо..

oyotsuket 14.05.2019 12:22

Другие вопросы по теме

Похожие вопросы