首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP - preg_replace :如果在图像中找到数据属性,则不替换

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

Stack Overflow用户
提问于 2022-04-04 18:32:26
回答 1查看 104关注 0票数 0

我试图从我的博客中清理一些页面,并使用preg_replace修改图片标签。当图像被清除后,我添加数据属性数据-更新,以避免第二次修改它们。

代码语言:javascript
复制
$final =  preg_replace('/<img(.*?)>/', '<img$1 data-updated=\'1\'>', $final);

但是,下次我运行清理时,将再次添加数据更新属性。我可以做一个str_replace来删除更新后的额外数据,但是我想首先避免通过regex添加它。

我尝试使用^data更新,但没有成功,我在这里发现了一个类似的帖子:替换表达式不能包含字符串,但是用数据更新替换数据花哨是行不通的。

是否有一种方法只添加数据更新,如果它还没有呢?其中还有许多其他标记,因此我需要能够检查img标记中任何地方是否存在数据更新。

下面是这样一幅图像的例子:

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

谢谢!洛朗

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-04 19:01:52

众所周知,像HTML这样的嵌套结构很难用正则表达式进行解析,因为这些结构是不规则的。更不用说,您显式需要的是一个解析器,因为您需要在进行修改之前测试是否存在属性。

对于这一点,有DOM。例:

代码语言:javascript
复制
$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();

输出:

代码语言:javascript
复制
<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>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71742134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档