PHP - preg_replace : 如果在图像中找到数据属性则不替换

PHP - preg_replace : no replace if data attribute is found in image

我正在尝试清理博客中的一些页面并使用 preg_replace 修改图像标签。清理图像后,我添加数据属性 data-updated 以避免第二次修改它们。

$final =  preg_replace('/<img(.*?)>/', '<img data-updated=\'1\'>', $final);

但是下一次我运行清理时,数据更新属性被添加了第二次。我可以做一个 str_replace 来删除额外的数据更新,但我想避免首先通过正则表达式添加它。

我尝试使用 [^data-updated] 但没有成功,我在这里找到了类似的 post: preg_replace expression can't include string 但是用数据更新替换数据花式不起作用

有没有办法只添加不存在的更新数据?中还有许多其他标签,因此我需要能够检查 img 标签中任何位置是否存在数据更新

下面是这样一张图片的例子:

<img srcset="xxx" src="yyy" loading="lazy" data-style="aspect-ratio:4/3;" data-placeholder="4-3" data-updated="y" alt="" width="100%">

谢谢! 洛朗

众所周知,像 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>