繁体   English   中英

在正则表达式中捕获多个重复组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM