我试图从我的博客中清理一些页面,并使用preg_replace修改图片标签。当图像被清除后,我添加数据属性数据-更新,以避免第二次修改它们。
$final = preg_replace('/<img(.*?)>/', '<img$1 data-updated=\'1\'>', $final);但是,下次我运行清理时,将再次添加数据更新属性。我可以做一个str_replace来删除更新后的额外数据,但是我想首先避免通过regex添加它。
我尝试使用^data更新,但没有成功,我在这里发现了一个类似的帖子:替换表达式不能包含字符串,但是用数据更新替换数据花哨是行不通的。
是否有一种方法只添加数据更新,如果它还没有呢?其中还有许多其他标记,因此我需要能够检查img标记中任何地方是否存在数据更新。
下面是这样一幅图像的例子:
<img srcset="xxx" src="yyy" loading="lazy" data-style="aspect-ratio:4/3;" data-placeholder="4-3" data-updated="y" alt="" width="100%">谢谢!洛朗
发布于 2022-04-04 19:01:52
众所周知,像HTML这样的嵌套结构很难用正则表达式进行解析,因为这些结构是不规则的。更不用说,您显式需要的是一个解析器,因为您需要在进行修改之前测试是否存在属性。
对于这一点,有DOM。例:
$html = <<<_E_
<html>
<head>
<title>Hello world</title>
</head>
<body>
<div>
<h1>Hello World!</h1>
<img src="/images/foo.jpg">
</div>
<div>
<img someattr="yes" src="/images/bar.jpg">
</div>
</body>
</html>
_E_;
$d = new DomDocument();
$d->loadHtml($html, LIBXML_HTML_NODEFDTD);
foreach($d->getElementsByTagName('img') as $node) {
if( $node->attributes->getNamedItem('someattr') === null ) {
$node->setAttribute('someattr', 'alsoyes');
}
}
echo $d->saveHTML();输出:
<html>
<head>
<title>Hello world</title>
</head>
<body>
<div>
<h1>Hello World!</h1>
<img src="/images/foo.jpg" someattr="alsoyes">
</div>
<div>
<img someattr="yes" src="/images/bar.jpg">
</div>
</body>
</html>https://stackoverflow.com/questions/71742134
复制相似问题