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表达式(显然).

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...