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*
-将“单词”捕获到第2组中,如“word1”或“word1-word2”…“word1-wordn”(\w+(?:-\w+*)
-可选组(由于(?:=([“\”])?[^\]*?\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
)