Regex 提取按空间分隔的组

Regex 提取按空间分隔的组,regex,preg-match,Regex,Preg Match,我得到了以下字符串(示例): 可以有1-n个属性。我想提取每个属性。(数据属性,数据属性=“值”)。我尝试了很多不同的方法,例如使用\[(?:(\S+)\S)*\]但是我没有正确地使用它。表达式应该以PREG样式编写。类似于[\s\[]([^\s\]]+(=“[^”]+)*)+ 给予 匹配1:数据属性 匹配2:data attr=“value”我建议用正则表达式抓取所有键值对: '~(?:([^][]*)\b\[|(?!^)\G)\s*(\w+(?:-\w+)*(?:=(["\'])?[^\]]

我得到了以下字符串(示例):


可以有1-n个属性。我想提取每个属性。(数据属性,数据属性=“值”)。我尝试了很多不同的方法,例如使用
\[(?:(\S+)\S)*\]
但是我没有正确地使用它。表达式应该以PREG样式编写。

类似于
[\s\[]([^\s\]]+(=“[^”]+)*)+

给予

匹配1:
数据属性


匹配2:
data attr=“value”

我建议用正则表达式抓取所有键值对:

'~(?:([^][]*)\b\[|(?!^)\G)\s*(\w+(?:-\w+)*(?:=(["\'])?[^\]]*?\3)?)~'
(见)然后

正则表达式上的注释(它看起来太复杂了):

  • (?:([^][]*)\b\[|(?!^)\G
    -边界:我们只在前面有一个单词(
    a-zA-Z0-9\
    )字符(带
    \b\[
    )的
    (?!^)\G
    匹配成功后开始匹配。此外,
    ([^][]*/code>)将捕获
    前的零件到第1组中[
  • \s*
    -匹配零个或多个空白符号
  • (\w+(?:-\w+*)
    -将“单词”捕获到第2组中,如“word1”或“word1-word2”…“word1-wordn”
  • (?:=([“\”])?[^\]*?\3)?
    -可选组(由于
    (?:…)?
    )匹配
    • =
      -等号
    • ([“\”])?
      -组3(检查值分隔符的辅助组)捕获
      或什么都不捕获
    • [^\]]*?
      -(值)除
      ]
      以外的零个或多个字符,尽可能少
    • \3
      -结束
      '
      (与第3组中捕获的值相同)

由于我们无法摆脱捕获
,因此我们可以
preg\u grep
使用
preg\grep(“~\A(?![\'”]\z)~”,$arr)
来捕获我们不感兴趣的所有元素,其中
\A(?![\']\z)
匹配任何不等于
的字符串

每个加载器元素是否都有相同的字符串结构?我的意思是,属性和值是否总是用一个空格分隔?我想应该足够了。谢谢,但我真的需要将组作为字符串。我的意图是,提取名称(加载器)作为第一场比赛,其他比赛如下。我试图在这里实现这一点:但我没有做对。我的目标是拥有马赫数:1:Loader/2:data prop/3:data attr=“value”使用单个
preg_match
捕获键值对就可以了?这在PCRE中是不可能的。我将根据当前的要求更新我的解决方案。很抱歉,仍然使用如此庞大的正则表达式。我希望它现在能像预期的那样工作。
'~(?:([^][]*)\b\[|(?!^)\G)\s*(\w+(?:-\w+)*(?:=(["\'])?[^\]]*?\3)?)~'
$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
)