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>
我正在尝试清理博客中的一些页面并使用 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>