首页 > 解决方案 > 在图像标签正则表达式中替换 .PNG 扩展名后的数据

问题描述

这是我的代码

<img src="folder/img1.jpg?somestring">
<img src="folder/img2.jpg?somediffstring">

想用整个 html 中的另一个字符串替换 somestring 和 somediffstring。请用php建议一些正则表达式。

示例更改为使用正则表达式或任何内容

标签: phphtmlregex

解决方案


首先,您不应该使用正则表达式解析 HTML


解决方案 1

现在,如果你只解析img标签,你可以想出一个足够令人满意的解决方案,如下所示:

(\b\.jpg|\b\.png)\?(.*?)\"

那是:

(\b\.jpg|\b\.png)  # 1st Capturing Group
    \b\.jpg        # 1st Alternative: match ``.jpg`` literally
    \b\.png        # 2nd Alternative: match ``.png`` literally
\?                 # Match the character ? literally
(.+?)              # 2nd Capturing Group
    .+?            # Match any character between one and unlimited times,
                   # as few times as possible, expanding as needed.
\"                 # Match the character " literally

问题

有什么问题?我们不检查我们是否在img标签内。这将匹配 HTML 中的所有位置。


解决方案 2

让我们添加检查img > src

<img.+?src=\".*?(\b\.jpg|\b\.png)\?(.+?)\"

那是:

<img       # Match ``<img`` literally
.+?        # Match any character between one and unlimited times,
           # as few times as possible, expanding as needed.
           # Needed in case there are rel or alt options inside the img tag.
src=\"     # Match ``src="`` literally
...        # The rest is same as before.

问题

这真的能发挥作用吗?表面上是,但实际上不是。

考虑以下 HTML 代码

<img src="data:image/png;base64,iVBORw0KG" />
<div style="background-image: url(../images/test-background.jpg?)">
     blah blah
</div>

应该不匹配吧?但确实如此(如果您删除换行符)。上面的正则表达式从 开始匹配<img src=",并将在">标记div处停止。捕获组将包含?":之间的字符),替换它会破坏 HTML。

这只是一个例子,但许多其他情况即使不应该匹配也会匹配。


其他解决方案...?

无论您可以向 RegEx 添加多少约束以及它变得多么复杂...... HTML 是一种无上下文语言,它不能被正则表达式捕获,它只能识别正则语言


在 PHP 中

仍然确定要使用正则表达式吗?好的,那么你的PHP功能是preg_replace. 您只需要记住,它将替换所有匹配的内容,而不仅仅是捕获组。因此,您需要将要“记住”的内容包装到另一个捕获组中:

$str = '<img src="folder/img1.jpg?foo">';
$pattern = '/(<img.+?src=\".*?(\b\.jpg|\b\.png)\?)(.+?)(\")/';
$replacement = '$1' . 'bar' . '$4';

$str_replaced = preg_replace($pattern, $replacement, $str);

// Now you have $str_replaced = '<img src="folder/img1.jpg?bar">';

推荐阅读