php - 如何使用正则表达式获取所有属性?

标签 php regex attributes

我制作了这个正则表达式来获取标签“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" />

结果:(http://www.regex101.com)

 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 anchor 来进行连续的字符串匹配。

(?:<img|(?<!^)\G)\h*([\w-]+)="([^"]*)"(?=.*?\/>)

从组索引 1 获取属性并从组索引 2 获取值。

DEMO

$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
)

关于php - 如何使用正则表达式获取所有属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28086220/

相关文章:

java - 由于换行符 (\n) 导致正则表达式中断

python - 检查python类属性

.net - 是否有使用属性来修改 WCF 操作行为的标准方法?

javascript - 用js构建正则表达式字符串

c# - 使用 BindAttribute 附加到子类 MVC3 模型中的白名单

php - 使用ckeditor在网页上显示图像,在图像源中添加额外的双引号和斜杠

php - 使用 HTML 生成一个打印机将忽略的空格

php - Symfony2 : Load config-files depending on domain

php - 如何插入一个字段以显示在 WordPress 帖子的内容字段上方?

java - 正则表达式匹配[[维基百科:Manual of Style#Links|]] # in java