Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正在捕获组下捕获组?_Php_Regex_Preg Match - Fatal编程技术网

Php 正在捕获组下捕获组?

Php 正在捕获组下捕获组?,php,regex,preg-match,Php,Regex,Preg Match,可以在“捕获组”下捕获组,这样我就可以拥有这样的数组 regex=(asd1)。(lol1),(asd2)。(asd2) string=asd1.lol1,asd2.lol2 return_数组[0]=>group[0]='asd1' return_数组[0]=>group[1]='lol1' 返回_数组[1]=>组[0]='asd2' return_数组[1]=>group[1]='lol2' 您可能正在寻找preg\u match\u all $regex = '/^((\w+)\.(\w

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

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

string=asd1.lol1,asd2.lol2

  • return_数组[0]=>group[0]='asd1'
  • return_数组[0]=>group[1]='lol1'
  • 返回_数组[1]=>组[0]='asd2'
  • return_数组[1]=>group[1]='lol2'

您可能正在寻找
preg\u match\u all

$regex = '/^((\w+)\.(\w+)),((\w+)\.(\w+))$/';
$string = 'asd1.lol1,asd2.lol2';
preg_match_all($regex, $string, $matches);
此函数将创建一个二维数组,其中第一个维度表示匹配的组(即括号,
0
包含整个匹配的字符串),每个数组都有子数组到所有匹配的行(在这种情况下仅1)

分组的最佳选择是处理所需数组的第一个维度,然后进一步处理它们,即从
1
4
中获取“asd1.lol1”,然后将它们进一步处理为
asd1
lol1

您在第一次跑步时不需要那么多括号:

$regex = '/^(\w+\.\w+),(\w+\.\w+)$/';
将产生:

[0] => ("asd1.lol1,asd2.lol2")
[1] => ("asd1.lol1")
[2] => ("asd2.lol2")
然后您可以将
1
2
中的数组拆分为更精细的值

可以将标志设置为
preg\u match\u all
,以对输出进行不同的排序。特别是,
PREG\u SET\u 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()
检查子阵列的大小,并处理阵列大小不合适的情况。我仍然相信这比使用正则表达式更舒服。

虽然使用正则表达式可以得到您想要的,但您也可以使用它来迭代看似简单的逗号分隔集:

$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
        )
)
Array
(
    [0] => Array
        (
            [0] => asd1.lol1
            [1] => asd1
            [2] => lol1
        )
    [1] => Array
        (
            [0] => asd2.lol2
            [1] => asd2
            [2] => lol2
        )
)
对于正则表达式,您的模式只需要包含围绕一个句点的两个术语,即:

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

您可以使用
PREG\u SET\u ORDER
重新排列结果集:)@Jack谢谢–我添加了一段(非常懒)的内容,提到
PREG\u SET\u ORDER
。我希望你不要介意,我没有意识到你的模式捕获了太多:)如果它只捕获两个点分隔的值,那么使用集合排序会更有用。
Array
(
    [0] => Array
        (
            [0] => asd1.lol1
            [1] => asd1
            [2] => lol1
        )
    [1] => Array
        (
            [0] => asd2.lol2
            [1] => asd2
            [2] => lol2
        )
)