提问人:Marek Barta 提问时间:12/16/2020 最后编辑:mickmackusaMarek Barta 更新时间:12/18/2020 访问量:146
替换 html 文档中的所有标题属性
Replace all title attributes in an html document
问:
我在变量中有 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);
}
答:
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>
评论
SimpleXMLElement()
title="whatever"
//*[@title]