微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php-正则表达式,如果它在myclass之外,则删除锚标记

我想使用正则表达式从给定的字符串中删除标记,如果它不在我的课程范围内.

输入:

<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();
?>

看到它working on ideone.com.

查看评论,您似乎仍然喜欢使用正则表达式(为什么?).
PCRE具有(* SKIP)(* FAIL)机制,该机制在此(简化的)示例中也适用:

<div\ class="myclass">
[\s\S]*?
</div>
(*SKIP)(*FAIL)
|
<a[^>]*>.*?</a>

请参阅此one on regex101.com的演示.
提示:不适用于嵌套的HTML字符串(< div>< div>)或诸如< p title =“< / div>”>之类的属性.都是有效的HTML表达式(显然).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐