preg_match给出的结果与perl字符串匹配不同

时间:2015-03-17 08:55:51

标签: php perl

我想从字符串中获取房间号,条件是(以#开头,以空格或逗号结尾)。

我的PHP代码是:

 preg_match('/(#.*?)[ ,]/',
   '112 east coast road #b1-15, 112 katong, singapore 428802', $match);
 if($match) {
 echo "match=".$match[0];
 }
 else {
   echo 'not match';
 }

输出为:<code>match=#b1-15,</code>

如您所见,捕获了一个逗号。

虽然我在perl中使用相同的模式      使用严格;

my $str = "112 east coast road #b1-15, 112 katong, singapore 428802";

if($str =~ /(#.*?)[ ,]/) {
    print "match = $1";
}
else {
    print "not match";
}

输出为:<code>match = #b1-15</code>

有人可以告诉我为什么以及如何纠正我的PHP模式匹配?

2 个答案:

答案 0 :(得分:1)

他们实际上也这样做。只有返回给您的信息不同。

preg_match返回一系列匹配项。您的匹配检查输出完全匹配的模式。

preg_match的回复将是

array(2
    0   =>  #b1-15,
    1   =>  #b1-15
)

第一个数组值是完全匹配的模式。第二个是第一个捕获的带括号的子模式,依此类推。

请参阅 http://php.net/manual/en/function.preg-match.php

请参阅有关参数matches

的部分

答案 1 :(得分:1)

PHP返回两个匹配项,因为您可以检查运行它:

preg_match('/(#.*?)[ ,]/','112 east coast road #b1-15, 112 katong, singapore    428802', $match);

的var_dump($匹配);

结果是:

array(2) {[0]=>string(7) "#b1-15,"[1]=>string(6) "#b1-15"}

第一场比赛是正则表达式的“全局”匹配,第二场比赛是第一场比赛。