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

Php preg_match给出的结果与perl字符串匹配不同,php,perl,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'; } 输出为:match=#b1-15, 如您所见,将捕获一个逗号 而

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

我的php代码是:

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

如您所见,将捕获一个逗号

而我在perl中使用相同的模式 严格使用

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

if($str =~ /(#.*?)[ ,]/) {
    print "match = $1";
}
else {
    print "not match";
}
输出为:
match=#b1-15


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

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

preg_match
返回匹配数组。匹配检查输出完全匹配的模式

将返回
preg_match

array(2
    0   =>  #b1-15,
    1   =>  #b1-15
)
第一个数组值是完全匹配的模式。第二个是第一个捕获的带括号的子模式,依此类推

请参阅


请参阅关于参数
匹配项的部分

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

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

结果是:

array(2) {[0]=>string(7) "#b1-15,"[1]=>string(6) "#b1-15"}
第一个匹配是正则表达式的“全局”匹配,第二个对应于第一个组