有没有办法让匹配模式改变顺序?例如,如果您有一个带有字母数字和 using 的字符串preg_match_all()
,并且您希望生成的匹配数组在字母之前有数字。有没有办法在正则表达式本身中指定它?
所以"aaa-111"
会导致匹配
array(0 => '111', 1 => 'aaa');
也许命名的捕获组会有所帮助。例子:
preg_match('/(?<alphapart>[a-z]+)-(?<numpart>[0-9]+)/', 'aaa-111', $matches);
$匹配:
array('alphapart' => 'asd', 'numpart' => '111')
这样,您可以通过名称而不是匹配它们的任何顺序索引来引用匹配项。
编辑:为了准确起见,我想注意 $matches 实际上也会按索引包含匹配项,因此实际的 $matches 将是:array(5) { [0]=> string(7) "aaa-111" ["alphapart"]=> string(3) "aaa" [1]=> string(3) "aaa" ["numpart"]=> string(3) "111" [2]=> string(3) "111" }
正则表达式中组的顺序取决于它们在正则表达式和字符串中的位置。改变顺序会让人很困惑。
您可以做的是使用“命名组”。
/(?P<letters>\w*)-(?P<digits>\d*)/
该数组仍将保持相同的顺序,但是,您可以使用它$matches['digits']
来轻松获取数字。
演示:http: //ideone.com/3tRJLZ
是的你可以。您可以使用不推动“光标”的前瞻,因此您可以先匹配最后一部分,然后再匹配第一部分。它适用于 (?=regex)
这有效:
(?=\w+\-(\d+))(\w+)\-\d+
但也会在索引 0 处给出完整匹配。像 ["aaa-111", "111", "aaa"] 有问题吗?
我不相信有。正则表达式不是为了排序而设计的。不过,您可以设置两个不同的正则表达式来检查每个模式。此代码将按照您的要求以 num/alpha 顺序回显两个字符串:
<?php
header('Content-Type: text/plain');
$string1 = 'aaa-123';
$string2 = '123-aaa';
echo 'String 1: '.$string1."\n";
echo 'String 2: '.$string2."\n";
$pattern1 = '/([\d]+)-([a-z]+)/i';
$pattern2 = '/([a-z]+)-([\d]+)/i';
echo 'Result 1: ';
if(preg_match($pattern1, $string1, $matches))
{
echo $matches[1].' '.$matches[2]."\n";
}
if(preg_match($pattern2, $string1, $matches))
{
echo $matches[2].' '.$matches[1]."\n";
}
echo 'Result 2: ';
if(preg_match($pattern1, $string2, $matches))
{
echo $matches[1].' '.$matches[2]."\n";
}
if(preg_match($pattern2, $string2, $matches))
{
echo $matches[2].' '.$matches[1]."\n";
}
?>
结果输出是:
String 1: aaa-123
String 2: 123-aaa
Result 1: 123 aaa
Result 2: 123 aaa
如果您希望数字首先出现,则需要自己对数组进行排序。
array_sort()
会... 为您解决。