Например, у меня есть следующий код:
$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 ?






Обратите внимание, что обычно зло и плохая практика использовать регулярное выражение для анализа 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.
$result = preg_replace ( "<p[^<]*to school[^<]*</p>" , "" , $string);
echo $result;
Примечание. У меня нет под рукой PHP для тестирования, но регулярное выражение должно работать, как проверено на Regex101.
Что вы имеете в виду под "пустым результатом"?
Я добавил «эхо», и теперь все должно быть в порядке. Или?
по-прежнему пустой результат.. но я пытался добавить / до <p и после /p>.. теперь это работает.. большое спасибо..
это работа .. чтобы получить то, что я хочу, я просто меняю «2000» на пустое .. большое спасибо ..