php - 在图像标签正则表达式中替换 .PNG 扩展名后的数据
问题描述
这是我的代码
<img src="folder/img1.jpg?somestring">
<img src="folder/img2.jpg?somediffstring">
想用整个 html 中的另一个字符串替换 somestring 和 somediffstring。请用php建议一些正则表达式。
示例更改为使用正则表达式或任何内容
解决方案
解决方案 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">';
推荐阅读
- python - OpenCV Python:如何将图像叠加到另一个图像的中心
- c# - Asp.net core 3.0 在发布或构建时发布视图文件 (.cshtml)
- sql - 这段代码是什么意思..[select @a:=password(?)]
- javascript - 如何在从另一个页面加载的模式中运行脚本?
- python-3.x - pyaudio 在录制声音时给出空输出文件 [MacOS Mojave 10.14.6]
- c - 使用用户输入 ('+' / '-') 进行数学运算的 C 控制台程序不起作用
- github - 为 GitHub 发布重用 Azure DevOps 管道
- python - 与 luigi docker 服务器共享卷
- php - Php 5.6 Code Igniter 3.1.x 会话在重定向到不同的 Rest 控制器时丢失
- scala - Play 2.7.x:ProvisionException:无法提供具有循环依赖关系的 play.api.Application