Обратите внимание, что обычно зло и плохая практика использовать регулярные выражения для разбора 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
.