我想使用正则表达式从给定的字符串中删除锚标记,如果它不在我的课程范围内.
输入:
<p>Hi Hello <a href="#">World</a></p>. This is <div class="myclass">testing <a href="#">content</a>. some more content</div>. One more <a href="#"> Link </a>.
输出:
<p>Hi Hello </p>. This is <div class="myclass"> testing <a href="#">content</a>. some more content</div>. One more .
提前致谢.
解决方法:
您可以(而且应该,顺便说一句)使用DOM方式(如果仅使用正则表达式,即使不是不可能,也很难).这里的方法是在没有祖先div.myclass的地方查找超链接,并将其从DOM中删除:
<?PHP
$html = <<<EOF
<p>Hi Hello <a href="#">World</a></p>.
This is <div class="myclass">testing <a href="#">content</a>. some more content</div>.
One more <a href="#"> Link </a>.
EOF;
$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXpath($dom);
$links = $xpath->query("//a[not(ancestor::div[@class='myclass'])]");
// Loop over them
foreach ($links as $link) {
$link->parentNode->removeChild($link);
}
// just to test it out
echo $dom->saveHTML();
?>
查看评论,您似乎仍然喜欢使用正则表达式(为什么?).
PCRE具有(* SKIP)(* FAIL)机制,该机制在此(简化的)示例中也适用:
<div\ class="myclass">
[\s\S]*?
</div>
(*SKIP)(*FAIL)
|
<a[^>]*>.*?</a>
请参阅此one on regex101.com的演示.
提示:不适用于嵌套的HTML字符串(< div>< div>)或诸如< p title =“< / div>”>之类的属性.都是有效的HTML表达式(显然).