在捕获组下捕获组?

时间:2014-06-28 00:07:18

标签: php regex preg-match

可以在捕获组下捕获组,这样我就可以拥有像这样的数组

regex = (asd1).(lol1),(asd2).(asd2)

string = asd1.lol1,asd2.lol2

  • return_array[0]=>group[0]='asd1';
  • return_array[0]=>group[1]='lol1';
  • return_array[1]=>group[0]='asd2';
  • return_array[1]=>group[1]='lol2';

2 个答案:

答案 0 :(得分:2)

虽然使用正则表达式可以得到你想要的东西,你也可以使用strtok()来迭代似乎只是逗号分隔的集合:

$results = array();
$str = 'asd1.lol1,asd2.lol2';

$token = strtok($str, ',');
while ($token !== false) {
    $results[] = explode('.', $token, 2);
    $token = strtok(',');
}

输出:

Array
(
    [0] => Array
        (
            [0] => asd1
            [1] => lol1
        )
    [1] => Array
        (
            [0] => asd2
            [1] => lol2
        )
)

使用正则表达式,您的模式只需要包含句点周围的两个术语,即:

$pattern = '/(?<=^|,)(\w+)\.(\w+)/';
preg_match_all($pattern, $str, $result, PREG_SET_ORDER);

(?<=^|,)是一个后视断言;它确保只匹配在搜索字符串开头或逗号之前出现的内容,但它不会消耗&#34;消费&#34;任何东西。

输出:

Array
(
    [0] => Array
        (
            [0] => asd1.lol1
            [1] => asd1
            [2] => lol1
        )
    [1] => Array
        (
            [0] => asd2.lol2
            [1] => asd2
            [2] => lol2
        )
)

答案 1 :(得分:1)

您可能正在寻找preg_match_all

$regex = '/^((\w+)\.(\w+)),((\w+)\.(\w+))$/';
$string = 'asd1.lol1,asd2.lol2';
preg_match_all($regex, $string, $matches);

此函数将创建一个二维数组,其中第一个维度表示匹配的组(即括号,0包含整个匹配的字符串),每个都有子阵列到所有匹配的行(仅1个)在这种情况下)。

[0] => ("asd1.lol1,asd2.lol2")  // a view of $matches
[1] => ("asd1.lol1")
[2] => ("asd1")
[3] => ("lol1")
[4] => ("asd2.lol2")
[5] => ("asd2")
[6] => ("lol2")

拥有组的最佳选择是处理所需数组的第一个维度,然后进一步处理它们,即得到&#34; asd1.lol1&#34;来自14,然后将其进一步处理为asd1lol1

在第一次运行中你不需要那么多的括号:

$regex = '/^(\w+\.\w+),(\w+\.\w+)$/';

将产生:

[0] => ("asd1.lol1,asd2.lol2")
[1] => ("asd1.lol1")
[2] => ("asd2.lol2")

然后,您可以将12中的数组拆分为更精细的值。

可以将标志设置为preg_match_all以不同方式排序输出。特别是,PREG_SET_ORDER允许您在同一个子数组中包含所有匹配的实例。如果您只处理一个字符串,这一点就不重要了,但是如果您要匹配文本中的模式,那么在$matches[0]中获取有关一个匹配项的所有信息可能会更方便,等等。


请注意,如果您只是用逗号分隔字符串,然后按任何句点分隔字符串,则可能不需要正则表达式,可以方便地使用explode()

$string = 'asd1.lol1,asd2.lol2';
$matches = explode(',', $string);
foreach($matches as &$match) {
    $match = explode('.', $match);
}

这将为您提供您想要的内容,但请注意,您不必像使用正则表达式那样控制流程 - 例如,asd1.lol1.lmao,asd2.lol2.rofl.hehe也可以正常运行,并且他们可以使用正常表达式。生成比你想要的更大的阵列。您可以使用count()检查子阵列的大小,并在阵列不具有适当大小时处理这些情况。我仍然认为比使用正则表达式更舒服。