描述
该表达式将:
- 查找所有具有属性
image
的标签img
src
- 忽略不是 image 或 img 的标签,比如
imagesomethingrandom
- 捕获 src 属性的值
- 正确处理单引号、双引号或不带引号的属性值
- 避免大多数棘手的边缘情况,这些情况在匹配 html 时似乎会绊倒正则表达式
<ima?ge?(?=\s|>)(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\ssrc=(['"]?)(.*?)\1(?:\s|>))(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*>
例子
现场正则表达式演示
现场 Python 演示
示例文本
注意第一行中相当困难的边缘情况
<img onmouseover=' src="NotTheDroidsYouAreLookingFor.png" ; if (x > 3) { funRotate(src); } ' src="http://another.example/picture.png">
<imagesomethingrandom class="logo" src="http://example.site/imagesomethingrandom.jpg">
<image class="logo" src="http://example.site/logo.jpg">
<img src="http://another.example/DoubleQuoted.png">
<image src='http://another.example/SingleQuoted.png'>
<img src=http://another.example/NotQuoted.png>
Python代码
#!/usr/bin/python
import re
string = """<img onmouseover=' src="NotTheDroidsYouAreLookingFor.png" ; if (x > 3) { funRotate(src); } ' src="http://another.example/picture.png">
<imagesomethingrandom class="logo" src="http://example.site/imagesomethingrandom.jpg">
<image class="logo" src="http://example.site/logo.jpg">
<img src="http://another.example/DoubleQuoted.png">
<image src='http://another.example/SingleQuoted.png'>
<img src=http://another.example/NotQuoted.png>
""";
regex = r"""<ima?ge?(?=\s|>)(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\ssrc=(['"]?)(.*?)\1(?:\s|>))(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*>""";
intCount = 0
for matchObj in re.finditer( regex, string, re.M|re.I|re.S):
print " "
print "[", intCount, "][ 0 ] : ", matchObj.group(0)
print "[", intCount, "][ 1 ] : ", matchObj.group(1)
print "[", intCount, "][ 2 ] : ", matchObj.group(2)
intCount+=1
捕获组
第 0 组获取整个图像或 img 标签
第 1 组获取包围 src 属性的引号,如果存在则
第 2 组获取 src 属性值
[ 0 ][ 0 ] : <img onmouseover=' src="NotTheDroidsYouAreLookingFor.png" ; if (x > 3) { funRotate(src); } ' src="http://another.example/picture.png">
[ 0 ][ 1 ] : "
[ 0 ][ 2 ] : http://another.example/picture.png
[ 1 ][ 0 ] : <image class="logo" src="http://example.site/logo.jpg">
[ 1 ][ 1 ] : "
[ 1 ][ 2 ] : http://example.site/logo.jpg
[ 2 ][ 0 ] : <img src="http://another.example/DoubleQuoted.png">
[ 2 ][ 1 ] : "
[ 2 ][ 2 ] : http://another.example/DoubleQuoted.png
[ 3 ][ 0 ] : <image src='http://another.example/SingleQuoted.png'>
[ 3 ][ 1 ] : '
[ 3 ][ 2 ] : http://another.example/SingleQuoted.png
[ 4 ][ 0 ] : <img src=http://another.example/NotQuoted.png>
[ 4 ][ 1 ] :
[ 4 ][ 2 ] : http://another.example/NotQuoted.png