匹配不在特定HTML标记内且不包含特定单词的字符

时间:2014-12-29 15:21:39

标签: php regex

我正在寻找执行以下操作的PHP正则表达式: (1)在<p>标签内获取文本,其中(2)不包含单词“x x x”和(3)未嵌套在<blockquote>

示例:

<p>This is one</p> //true
<p>This is one x x x</p> //false, has "x x x"
<blockquote><i>something</i><p>This is one</p></blockquote> //false, nested inside blockquote

1 个答案:

答案 0 :(得分:3)

正则表达式是此作业的错误工具。即使只是为了“快速修复”,它仍然不是正确的工具。

我喜欢在这里使用的工具称为XPath。使用PHP的DOMDocument和DOMXPath类,我们可以找到您想要的值。

我使用了您的HTML,然后搜索了符合您条件的<p>个标签。

<?php
$html = <<<END
<p>This is one</p>
<p>This is one x x x</p>
<blockquote><i>something</i><p>This is one</p></blockquote>
END;

$DOM = new DOMDocument;
$DOM->loadHTML($html);
$xPath = new DOMXPath($DOM);

$p = $xPath->query('//p[not(contains(text(), "x x x")) and not(ancestor::blockquote)]');

foreach($p as $e){
    echo $e->nodeValue;
}

DEMO:https://eval.in/238099

编辑:使用更好的XPath查询更新答案以使用嵌套标记。