2015-03-17 3 views
0

Я хотел бы записать номер комнаты из строки, а условие (начинать с # и заканчивать пробелом или запятой).preg_match дает разные результаты, чем соответствие строки 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 use strict;

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 соответствия шаблону?

ответ

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

Первый матч «глобальный» матч вашей регулярное выражение второй соответствует первой группе.

1

Они на самом деле делают то же самое. Только информация, возвращенная вам, отличается.

preg_match возвращает массив совпадений. Проверка соответствия выводит полностью согласованный шаблон.

Возвращение preg_match будет

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

Первое значение массива является полное соответствие модели. Второй - первый захваченный подшаблон в скобках и т. Д.

Пожалуйста, обратитесь к http://php.net/manual/en/function.preg-match.php

Смотрите раздел о параметре matches

Смежные вопросы