我发现答案php regex - strip everything off <a> tags except href很有帮助,除了它不会过滤这些古怪的自定义属性,例如此处的此标记:
<p>Video <a href="https://www.youtube.com/watch?v=foo" target="_blank" data-vivaldi-spatnav-clickable="1">on Youtube</a></p>
<p>And a Book <a href="https://www.amazonas.br/bar" target="_blank" data-vivaldi-spatnav-clickable="1">to buy</a></p>
目标元素可以很好地删除,但是自定义元素保留。
我期望的是类似的东西
<p>Video <a href="https://www.youtube.com/watch?v=foo">on Youtube</a></p>
<p>And a Book <a href="https://www.amazonas.br/bar">to buy</a></p>
我使用了上面链接中的php:
$dom = new DOMDocument;
$errorState = libxml_use_internal_errors(TRUE); // don't display errors
$dom->loadHTML(htmlspecialchars_decode($str));
foreach ($dom->getElementsByTagName('a') as $node) {
foreach ($node->attributes as $attr) {
if ($attr->name !== 'href') {
$node->removeAttribute($attr->name);
}
}
}
libxml_use_internal_errors($errorState); // reset the state
$str = $dom->saveXML();
答案 0 :(得分:1)
在此处查看注释〜http://php.net/manual/en/class.domnamednodemap.php#94346。
这是变异您要迭代的集合的经典示例。简单的答案,从最后开始,然后倒退。
for ($i = $node->attributes->length - 1; $i >= 0; $i--) {
$attr = $node->attributes->item($i);
if ($attr->name !== 'href') {
$node->removeAttributeNode($attr);
}
}