替换 html 文档中的所有标题属性

Replace all title attributes in an html document

提问人:Marek Barta 提问时间:12/16/2020 最后编辑:mickmackusaMarek Barta 更新时间:12/18/2020 访问量:146

问:

我在变量中有 html 代码。例如,等于:$html

<div title="Cool stuff" alt="Cool stuff"><a title="another stuff">......</a></div>

我需要将所有标题属性等内容替换为 .title="Cool stuff"title="anot stuff"title="$newTitle"

有没有非正则表达式方法可以做到这一点?

如果我必须使用正则表达式,是否有比我想出的更好(性能方面)和/或更优雅的解决方案?

$html = '...'
$newTitle = 'My new title';

$matches = [];
preg_match_all(
    '/title=(\"|\')([^\"\']{1,})(\"|\')/',
    $html,
    $matches
);
$attributeTitleValues = $matches[2];

foreach ($attributeTitleValues as $title)
{
    $html = str_replace("title='{$title}'", "title='{$newTitle}'", $html);
    $html = str_replace("title=\"{$title}\"", "title=\"{$newTitle}\"", $html);
}
php dom 替换 html 解析

评论

2赞 MonkeyZeus 12/16/2020
您应该使用 of 将 html 转换为对象,以便您可以在具有 .请参阅 stackoverflow.com/a/65206705/2191572 以开始使用。SimpleXMLElement()title="whatever"
0赞 Tim Lewis 12/16/2020
@MonkeyZeus啊,我没有看到横幅“这个答案的内容有争议......”。当被问😅到有关正则表达式和 HTML 的问题时,我刚刚多次看到这个答案
1赞 MonkeyZeus 12/16/2020
要获取具有标题的所有节点,则可以使用此功能//*[@title]
1赞 Marek Barta 12/17/2020
@MonkeyZeus谢谢。这似乎是我一直在寻找的那种解决方案。
0赞 Marek Barta 1/14/2021
我不能接受这是正确的答案,所以我会接受另一个(后来)来关闭它。但再次感谢你,

答:

1赞 mickmackusa 12/18/2020 #1

绝对不要使用正则表达式 - 这是一个肮脏的兔子洞。
。洞是脏的,不是兔子:)

我更喜欢使用 DomDocument 和 Xpath 直接针对 html 文档中所有元素的所有属性。title

  • LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD标志已到位,以防止您的输出被 和 标记装饰。<doctype><html>
  • //在 XPath 表达式中说:转到任何深度以搜索匹配项

代码:(演示)

$html = <<<HTML
<div title="Cool stuff" alt="Cool stuff"><a title="another stuff">......</a></div>
HTML;
$newTitle = 'My new title';

$dom = new DOMDocument();
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);
foreach ($xpath->query('//@title') as $attr) {
    $attr->value = $newTitle;
}
echo $dom->saveHTML();

输出:

<div title="My new title" alt="Cool stuff"><a title="My new title">......</a></div>