我有跟随字符串(示例):
Loader[data-prop data-attr="value"]
可以有1-n个属性。我想提取每个属性。 (数据丙,数据-ATTR ="值&#34)。我尝试过许多不同的方式,例如\[(?:(\S+)\s)*\]
,但我没有把它弄好。表达式应该用PREG风格写成。
答案 0 :(得分:1)
我建议用正则表达式抓取所有键值对:
'~(?:([^][]*)\b\[|(?!^)\G)\s*(\w+(?:-\w+)*(?:=(["\'])?[^\]]*?\3)?)~'
(见regex demo)然后
请参阅IDEONE demo
$re = '~(?:([^][]*)\b\[|(?!^)\G)\s*(\w+(?:-\w+)*(?:=(["\'])?[^\]]*?\3)?)~';
$str = "Loader[data-prop data-attr=\"value\" more-here='data' and-one-more=\"\"]";
preg_match_all($re, $str, $matches);
$arr = array();
for ($i = 0; $i < count($matches); $i++) {
if ($i != 0) {
$arr = array_merge(array_filter($matches[$i]),$arr);
}
}
print_r(preg_grep('~\A(?![\'"]\z)~', $arr));
输出:
Array
(
[3] => data-prop
[4] => data-attr="value"
[5] => more-here='data'
[6] => and-one-more=""
[7] => Loader
)
关于正则表达式的注释(它看起来太复杂了):
(?:([^][]*)\b\[|(?!^)\G)
- 边界:我们只会在[
开头匹配,前面有一个字(a-zA-Z0-9_
)字符(带\b\[
),或者紧跟在成功匹配((?!^)\G
)。 此外,([^][]*)
会将[
之前的部分捕获到第1组。 \s*
- 匹配零个或多个空白符号(\w+(?:-\w+)*)
- 捕获到第2组&#34;单词&#34;喜欢&#34; word1&#34;或&#34; word1-word2&#34; ...&#34; word1-wordn&#34; (?:=(["\'])?[^\]]*?\3)?
- 可选组(由于(?:...)?
)匹配
=
- 等号(["\'])?
- 第3组(检查值分隔符的辅助组)捕获"
,'
或任何内容[^\]]*?
- (值)尽可能少的]
以外的零个或多个字符\3
- 结束'
或"
(第3组中捕获的相同值)。由于我们无法摆脱捕获'
或"
,我们可以preg_grep
使用preg_grep('~\A(?![\'"]\z)~', $arr)
\A(?![\'"]\z)
'
我们不感兴趣的所有元素匹配任何不等于"
或|
的字符串。
答案 1 :(得分:0)
如[\s\[]([^\s\]]+(="[^"]+)*)+
给出
比赛1:data-prop
比赛2:data-attr="value"