从链接标签过滤属性,PHP中的href除外

时间:2018-06-20 02:14:48

标签: php

我发现答案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();

1 个答案:

答案 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);
    }
}

演示〜https://eval.in/1024619