向 HTML 元素添加属性

11

我还不太明白,我正在寻找一些代码,可以为HTML元素添加属性。

例如,假设我有一个包含<a>的字符串,并且需要为<a>添加属性,那么<a>将被添加style="xxxx:yyyy;"。你会如何做到这一点?

理想情况下,它应该可以为任何标签添加任何属性。


https://dev59.com/X3I-5IYBdhLWcg3wq6do#1732454 - Mike Axiak
我实际上编写了一个 PHP 函数来完成这个任务... 我想在一段文本中搜索所有超链接,并创建一个 target='blank' 属性,或将现有属性更改为 target='blank'。这是一个相当复杂的过程,正则表达式匹配只是其中的一小部分。 - Sam Dufel
2个回答

21

已经说了无数遍了。不要使用正则表达式来解析HTML。

    $dom = new DOMDocument();
    @$dom->loadHTML($html);
    $x = new DOMXPath($dom);

    foreach($x->query("//a") as $node)
    {   
        $node->setAttribute("style","xxxx");
    }
    $newHtml = $dom->saveHtml()

4
您如何防止 DOMDocument() 在给定标签周围添加 <html> 包装器? - Sisir
1
使用另一种语言。开个玩笑,由于DOMDocument本质上是垃圾,您必须对文档进行一些str_replace操作以删除它添加的任何内容。 - Ms01
您可以使用$node->c14n()来获取节点的规范化HTML。它不会包含<html>标签。 - Byron Whitlock
使用正则表达式解析HTML有一些非常好的理由...尽管在这种情况下,你是正确的,原帖作者不应该使用正则表达式,而应该寻找其他解决方案。 - Philipp

10

这里使用正则表达式:

  $result = preg_replace('/(<a\b[^><]*)>/i', '$1 style="xxxx:yyyy;">', $str);

但是正则表达式无法解析格式不正确的HTML文档。


为什么在 [^><] 中需要 < - Déjà vu
为了避免出现意外情况,即正则表达式不会处理未正确关闭的a标签,例如:<a href="xxx" <p>yyy</p>;在这种情况下,如果我没有包含<,那么正则表达式将认为a标签的范围是<a href="xxx" <p> - Vantomex
如果有人决定在属性内包含<作为字面字符,最好失败匹配,而不是进一步破坏HTML。 - Tim Pietzcker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接