如何删除 <p> 中包含特殊词的段落标记 preg_replace?

How to remove paragraph tag <p> with contains special word in 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>';

现在,我想删除包含单词 'to school' 的段落。 我想要的输出是<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>).)*

这是一个 tempered 点,它的工作原理是在我们匹配任何字符的每个步骤中应用负先行 (?!</p>)。这很关键,因为它确保正则表达式引擎不会意外地跨越多个 <p> 标签来查找 to school.

$result = preg_replace ( "<p[^<]*to school[^<]*<\/p>" , "" , $string);
echo $result;

Regex101


注意:我手头没有 PHP 来测试,但正则表达式应该可以工作,正如在 Regex101 上测试的那样。