php正则表达式 - 剥离所有内容<a> tags except href</a>

时间:2014-04-08 12:56:45

标签: php html regex

另一个带有正则表达式问题的HTML

我正试图从<a>标签中删除所有内容,但href。

除外

我放在一起的以下正则表达式就是这样,直到它找到一个不匹配的标签(没有href引用的标签)

然后它一直在寻找直到下一个href,然后完全接受它。

检查: http://regex101.com/r/zO0cX3

正如您在此处所看到的,&lt;a id=&quot;5quot;&gt;test&lt;/a&gt;被删除,即使它不应该被删除。

输出应该只是<a href="blabla">blabla</a>,所以删除在href之后变为href之前的任何内容,但仍然在<a>标记本身之间。如果没有href,正则表达式应该忽略它并保留它。

这可能是一个简单的解决方案,但即使我尝试也无法想出它。即使没有href,有没有办法“查看”结尾>

1 个答案:

答案 0 :(得分:0)

HTML不是常规语言,无法通过正则表达式正确解析。请改用DOM解析器,这样即使将来标记的格式发生变化,您的代码仍然有效。这是使用PHP DOMDocument类:

的一种解决方案
$dom = new DOMDocument;
$errorState = libxml_use_internal_errors(TRUE); // don't display errors
$dom->loadHTML(htmlspecialchars_decode($html));

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
echo $dom->saveXML();

Demo