[英]Capture multiple repetitive group in regex
我正在使用/{(\\w+)\\s+((\\w+="\\w+")\\s*)+/
pattern来捕获所有属性。 问题是它匹配输入但不能逐个分组属性,只是将最后一个属性分组。
[person name="Jackson" family="Smith"]
要么
[car brand="Benz" type="SUV"]
您可以尝试\\[\\S+ ((?:[^"]+"){2}) ((?:[^"]+"){2})\\]
说明:
\\[
- 匹配[
字面意思
\\S+
- 一个或多个非空格字符
(?...)
- 非捕获组
[^"]+"
- 匹配其他一个或多个字符"
并由于{2}
重复两次
\\]
- 匹配]
字面意思
在第一个捕获组将是您的第一个属性,在第二个将有第二个属性。
\\G
( 继续 )元字符是这里要求的英雄。
代码:( PHP演示 )( Regex101演示 )
$tag = '[person name="Jackson" family="Smith"]';
var_export(preg_match_all('~(?:\G|\[\w+) (\w+)="(\w+)"~', $tag, $out) ? array_combine($out[1], $out[2]) : []);
输出:
array (
'name' => 'Jackson',
'family' => 'Smith',
)
如果需要使用标记名称来汇集属性和值,则只需要一个循环。
代码:( 演示 )
$text = 'some text [person name="Jackson" family="Smith"] text [vehicle brand="Benz" type="SUV" doors="4" seats="7"]';
foreach (preg_match_all('~(?:\G(?!^)|\[(\w+)) (\w+)="(\w+)"~', $text, $out, PREG_SET_ORDER) ? $out : [] as $matches) {
if ($matches[1]) {
$tag = $matches[1]; // cache the tag name for reuse with subsequent attr/val pairs
}
$result[$tag][$matches[2]] = $matches[3];
}
var_export($result);
输出:
array (
'person' =>
array (
'name' => 'Jackson',
'family' => 'Smith',
),
'vehicle' =>
array (
'brand' => 'Benz',
'type' => 'SUV',
'doors' => '4',
'seats' => '7',
),
)
最好更好地使用两个表达式(或一个解析器)。 考虑以下:
<?php
$junk = <<<END
lorem ipsum lorem ipsum
[person name="Jackson" family="Smith"]
lorem ipsum
[car brand="Benz" type="SUV"]
lorem ipsum lorem ipsum
END;
$tag = "~\[(?P<tag>\w+)[^][]*\]~";
$key_values = '~(?P<key>\w+)="(?P<value>[^"]*)"~';
preg_match_all($tag, $junk, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
echo "Name: {$match["tag"]}\n";
preg_match_all($key_values, $match[0], $attributes, PREG_SET_ORDER);
print_r($attributes);
}
?>
我们在这里
\[(?P<tag>\w+)[^][]*\]
对于可能的标签和
(?P<key>\w+)="(?P<value>[^"]*)"
用于键/值对。 其余的是一个foreach循环。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.