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
)
)