如何使用正则表达式获取所有属性?
How to get all of attributes with regex?
我制作了这个正则表达式来获取标签 "img" 中的所有属性。
/<img\s+(?:([a-z_-]+)\s*=\s*"(.*?)"\s*)*\s*\/>/g
但是,它只需要最后一个属性。
如何使用正则表达式获取所有属性?
测试字符串:
<img src="abc.png" alt="abc" />
<img alt="def" src="def.png" />
<img src="abc.png" alt="abc" style="border:none" />
<img alt="def" src="def.png" style="border:none" />
MATCH 1
1. [19-22] `alt`
2. [24-27] `abc`
MATCH 2
1. [47-50] `src`
2. [52-59] `def.png`
MATCH 3
1. [93-98] `style`
2. [100-111] `border:none`
MATCH 4
1. [145-150] `style`
2. [152-163] `border:none`
我建议您使用 \G
锚点来进行连续的字符串匹配。
(?:<img|(?<!^)\G)\h*([\w-]+)="([^"]*)"(?=.*?\/>)
从组索引 1 获取属性并从组索引 2 获取值。
$string = <<<EOT
<img src="abc.png" alt="abc" />
<img alt="def" src="def.png" />
<img src="abc.png" alt="abc" style="border:none" />
<img alt="def" src="def.png" style="border:none" />
EOT;
preg_match_all('~(?:<img|(?<!^)\G)\h*(\w+)="([^"]+)"(?=.*?\/>)~', $string, $match);
print_r($match[1]);
print_r($match[2]);
输出:
Array
(
[0] => src
[1] => alt
[2] => alt
[3] => src
[4] => src
[5] => alt
[6] => style
[7] => alt
[8] => src
[9] => style
)
Array
(
[0] => abc.png
[1] => abc
[2] => def
[3] => def.png
[4] => abc.png
[5] => abc
[6] => border:none
[7] => def
[8] => def.png
[9] => border:none
)
试试这个:
/(\w+)=["']([a-zA-Z0-9_.:'"]+)["']/
请记住,如果不支持 php 选项 g,请使用 preg_match_all() 函数
在以下位置试用:https://regex101.com/r/cQ8jT2/1
我制作了这个正则表达式来获取标签 "img" 中的所有属性。
/<img\s+(?:([a-z_-]+)\s*=\s*"(.*?)"\s*)*\s*\/>/g
但是,它只需要最后一个属性。
如何使用正则表达式获取所有属性?
测试字符串:
<img src="abc.png" alt="abc" />
<img alt="def" src="def.png" />
<img src="abc.png" alt="abc" style="border:none" />
<img alt="def" src="def.png" style="border:none" />
MATCH 1
1. [19-22] `alt`
2. [24-27] `abc`
MATCH 2
1. [47-50] `src`
2. [52-59] `def.png`
MATCH 3
1. [93-98] `style`
2. [100-111] `border:none`
MATCH 4
1. [145-150] `style`
2. [152-163] `border:none`
我建议您使用 \G
锚点来进行连续的字符串匹配。
(?:<img|(?<!^)\G)\h*([\w-]+)="([^"]*)"(?=.*?\/>)
从组索引 1 获取属性并从组索引 2 获取值。
$string = <<<EOT
<img src="abc.png" alt="abc" />
<img alt="def" src="def.png" />
<img src="abc.png" alt="abc" style="border:none" />
<img alt="def" src="def.png" style="border:none" />
EOT;
preg_match_all('~(?:<img|(?<!^)\G)\h*(\w+)="([^"]+)"(?=.*?\/>)~', $string, $match);
print_r($match[1]);
print_r($match[2]);
输出:
Array
(
[0] => src
[1] => alt
[2] => alt
[3] => src
[4] => src
[5] => alt
[6] => style
[7] => alt
[8] => src
[9] => style
)
Array
(
[0] => abc.png
[1] => abc
[2] => def
[3] => def.png
[4] => abc.png
[5] => abc
[6] => border:none
[7] => def
[8] => def.png
[9] => border:none
)
试试这个:
/(\w+)=["']([a-zA-Z0-9_.:'"]+)["']/
请记住,如果不支持 php 选项 g,请使用 preg_match_all() 函数
在以下位置试用:https://regex101.com/r/cQ8jT2/1