2

有没有办法让匹配模式改变顺序?例如,如果您有一个带有字母数字和 using 的字符串preg_match_all(),并且您希望生成的匹配数组在字母之前有数字。有没有办法在正则表达式本身中指定它?

所以"aaa-111"会导致匹配

array(0 => '111', 1 => 'aaa');
4

5 回答 5

5

也许命名的捕获组会有所帮助。例子:

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" }

于 2012-11-19T19:59:56.603 回答
3

正则表达式中组的顺序取决于它们在正则表达式和字符串中的位置。改变顺序会让人很困惑。

您可以做的是使用“命名组”

/(?P<letters>\w*)-(?P<digits>\d*)/

该数组仍将保持相同的顺序,但是,您可以使用它$matches['digits']来轻松获取数字。

演示:http: //ideone.com/3tRJLZ

于 2012-11-19T20:01:14.340 回答
2

是的你可以。您可以使用不推动“光标”的前瞻,因此您可以先匹配最后一部分,然后再匹配第一部分。它适用于 (?=regex)

这有效:

(?=\w+\-(\d+))(\w+)\-\d+

但也会在索引 0 处给出完整匹配。像 ["aaa-111", "111", "aaa"] 有问题吗?

于 2012-11-19T19:56:31.630 回答
0

我不相信有。正则表达式不是为了排序而设计的。不过,您可以设置两个不同的正则表达式来检查每个模式。此代码将按照您的要求以 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
于 2012-11-19T19:54:49.950 回答
-1

如果您希望数字首先出现,则需要自己对数组进行排序。

array_sort()会... 为您解决。

于 2012-11-19T19:53:56.937 回答