提取按空格分隔的组

时间:2016-02-19 11:10:11

标签: regex preg-match

我有跟随字符串(示例):

Loader[data-prop data-attr="value"]

可以有1-n个属性。我想提取每个属性。 (数据丙,数据-ATTR ="值&#34)。我尝试过许多不同的方式,例如\[(?:(\S+)\s)*\],但我没有把它弄好。表达式应该用PREG风格写成。

2 个答案:

答案 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"