在PHP正则表达式中使用^和$的意外结果?

时间:2012-05-18 15:24:03

标签: php regex preg-match

  

可能重复:
  What do ^ and $ mean in a regular expression?

我对正则表达并不擅长,我知道它们非常重要,但从未找到时间研究它们。无论如何,我只是想确保在这些字符串中:

MAX_AGE_60
MAX_AGE_80
...
MAX_AGE_X

其中一般Xinteger至少找到一个匹配,并获取数字X。所以按照PHP文档的例子我写了这个:

// Starts and ends with the literal 'MAX_AGE_' followed by a group that is a 
// number with at least one digit. Case insensitive
$pattern = '/^MAX_AGE_(?P<max>\d+)$/i';

$test    = 'MAX_AGE_80';
$matches = array();

preg_match($pattern, $test, $matches);
var_dump($matches);

结果是错误的(惊讶......):

array (size=0)
  empty

删除开始/结束分隔符(^$)我得到了正确的结果:

array (size=3)
  0     => string 'MAX_AGE_80' (length=10)
  'max' => string '80' (length=2)
  1     => string '80' (length=2)

那么为什么我不能强制字符串必须以该模式开始和结束?那怎么解释结果数组呢?我的意思是索引01max

2 个答案:

答案 0 :(得分:2)

我不确定你在那里的括号之间做了什么。试试这个:

$pattern = '/^MAX_AGE_[\p{N}]+$/iu';

^ $和not之间的区别在于,它们仅标记位于LINE的开头和/或末尾的匹配

您可以使用此站点测试您的表达式(非unicode): http://www.gskinner.com/RegExr/

答案 1 :(得分:0)

尝试使用

$pattern = '/^MAX_AGE_(?P<max>\d+)\s*$/i';

因为行结束前可能有空格。