PHP正则表达式提取和替换HTML img标签属性的实战指南

清欢
清欢
发布时间:2026-10-15 | 5人浏览过
原创

在处理Web开发中的数据时,经常需要解析HTML字符串以获取或修改图片信息。本文将提供PHP中正则表达式提取img标签属性(如src、width、height)以及进行属性替换的具体代码示例和操作方法。

核心功能与准备

PHP内置的 preg_match 用于单次匹配,preg_match_all 用于全局多次匹配,preg_replace 则用于查找并替换匹配的字符串。以下操作将基于一段包含多个img标签的HTML字符串进行演示。

第1步:提取单个IMG标签的指定属性

目的:从复杂的HTML片段中精准定位并获取某一张图片的某个具体属性值。

  • 入口:preg_match 函数配合相应的正则模式。
  • 关键参数:目标字符串 $str,正则表达式,接收结果的数组 $match。
<?php
$str = '<center><img src="https://img.ipython.cn/uploads/images/20100516000.jpg" height="120" width="120"><br />PHP正则提取或更改图片img标记中的任意属性</center>';

// 1. 提取整个Img标签代码
// 说明:匹配带有src属性且支持单双引号的img标签
preg_match('/<\s*img\s+[^>]*?src\s*=\s*(\'|\")(.*?)\\1[^>]*?\/?\s*>/i',$str,$match);
echo "完整标签: " . $match[0] . "<br/>";

// 2. 提取Width属性
preg_match('/<img.+(width=\"?\d*\"?).+>/i',$str,$match);
echo "Width: " . $match[1] . "<br/>";

// 3. 提取Height属性
preg_match('/<img.+(height=\"?\d*\"?).+>/i',$str,$match);
echo "Height: " . $match[1] . "<br/>";

// 4. 提取Src路径 (仅匹配常见图片格式)
preg_match('/<img.+src=\"?(.+\.(jpg|gif|bmp|bnp|png))\"?.+>/i',$str,$match);
echo "Src Path: " . $match[1];
?>

第2步:使用正则替换IMG标签属性

目的:在保留图片文件名不变的情况下,修改存储路径或删除尺寸限制。常用于图片服务器迁移或自适应布局清理。

  • 工具:preg_replace
  • 替换逻辑:利用捕获组(Group 1, Group 2...)重构新字符串。
<?php
// 场景A:将src路径中的 images/ 替换为 uc/images/ (保留宽高属性)
$new_str_1 = preg_replace('/(<img.+src=\"?.+)images\/(.+\.(jpg|gif|bmp|bnp|png)\"?.+>)/i', "${1}uc/images/${3}", $str);
echo $new_str_1;

// 场景B:同时替换路径并删除所有宽高属性
// 技巧:在替换字符串中直接闭合标签,忽略原内容中的其他属性
$new_str_2 = preg_replace('/(<img).+(src=\"?.+)images\/(.+\.(jpg|gif|bmp|bnp|png)\"?).+>/i', "${1} ${2}uc/images/${3}>", $str);
echo $new_str_2;
?>

第3步:批量提取内容中的所有图片地址

当需要将文章内容中的全部图片URL抓取出来时,应使用 preg_match_all。以下两种正则可适配不同来源的内容:

  1. 标准提取(不含Base64):
    preg_match_all('/(\s+src\s?\=)\s?[\'|\"]([^\'\"]*)/is', $request->input('detail_content'), $match);
  2. 包含Data URI(内联图片):
    preg_match_all('/(\s+src\s?\=)\s?[\'|\"]([^\'\"]*)[data]/is', $request->input('detail_content'), $match);

若需针对特定HTML结构进行结构化匹配,可使用以下更严谨的正则:

<?php
$str = '<p><img src="/upload/test.png" /></p>';
$preg = '/<img.*?src=[\"|\']?(.*?)[\"|\']?\s.*?>/i';
preg_match_all($preg, $str, $allImg);
print_r($allImg);
// 输出结果将包含完整的Tag在索引0,只包含路径在索引1
?>

注意事项与总结

虽然正则表达式在文本处理中效率极高,但对于极其复杂或非规范的HTML嵌套结构,DOMDocument类库是更稳健的选择。在使用正则替换时,务必先在测试环境中验证捕获组的引用(如 ${1}),以避免路径错误导致图片失效。以上就是PHP正则提取或替换img标记属性的详细内容,更多关于PHP正则处理HTML数据的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表