2013-03-22 2 views
2

Синтаксический кодPHP: preg_match `eats` моя строка

$str = 'My name is Michael. I am a sportsman!'; 
preg_match('|My name is (.*?)\. I am a (.*?)|', $str, $m); 
print_r($m); 

возвращает мне строку:

Array ([0] => My name is Michael. I am a [1] => Michael [2] =>) 

Где sportsman?

ответ

5

Это потому, что выражение не закреплено, или, скорее, второе (.*?) не имеет предусмотрительности и поэтому ничего не соответствует); Вы должны добавить якорь конца-строки, как это:

preg_match('|My name is (.*?)\. I am a (.*?)$|', $str, $m); 
              ^

Вы можете также сделать второе выражение жадного:

preg_match('|My name is (.*?)\. I am a (.*)|', $str, $m); 
             ^
+1

В качестве альтернативы, это потому, что вторая часть не жадный, таким образом, почему требуется привязка. Если вы сделаете его жадным (т.е. '(. *) |'), Он будет соответствовать без привязки выражения. – Jon

+0

@Jon Абсолютно верно :) добавил к моему ответу. –