2016-05-29 1 views
2

У меня есть соответствие preg_match для определенных шаблонов, но это просто не соответствует шаблону, который я пытаюсь сопоставить. Что я делаю не так?Использование preg_match для соответствия этому конкретному шаблону

<?php 

$string = "tell me about cats"; 
preg_match("~\b(?:tell me about|you know(?: of| about)?|what do you think(?: of| about)?|(?:what|who) is|(?:whats|whos)) ((?:[a-z]+){1,2})$~", $string, $match); 
print_r($match); 

?> 

Ожидаемый результат:

массив (0 => скажите мне о 1 => кошки)

Фактический результат:

массив()

+0

https://regex101.com/r/cN8yO2/1 На правой стороне есть объяснения того, что все средства. – Mike

+0

Полезный инструмент: [http://regexr.com/](http://regexr.com/) –

ответ

2

You имеют дополнительное пространство в (но послепробелов нетделает все регулярное выражение потерпеть неудачу)

((?:[a-z]+){1,2}) 
      ^^ 
      || 
     here 

также, вы не захватив группу для первой части (из-за (?:..)). Сделать захват группу и сделать пространство опционально с помощью ?(если вы хотите, чтобы захватить более двух слов)

\b(tell me about|you know(?: of| about)?|what do you think(?: of| about)?|(?:what|who) is|(?:whats|whos)) ((?:[a-z]+){1,2} ?)$ 

Regex Demo

PHP код

$string = "tell me about cats"; 
preg_match("~\b(tell me about|you know(?: of| about)?|what do you think(?: of| about)?|(?:what|who) is|(?:whats|whos)) ((?:[a-z]+ ?){1,2})$~", $string, $match); 
print_r($match); 

ПРИМЕЧАНИЕ: - $match[1] и $match[2] будет содержать ваш результат. $match[0] зарезервирован для полного соответствия, найденного регулярным выражением в строке.

Ideone Demo

+0

Причина, по которой я положил {1,2} в конце, состояла в том, что я хотел сопоставить одно ИЛИ два слова, но при по меньшей мере один. Удаление пространства делает его таким, что оно соответствует только одному слову. – frosty

+0

@frosty также обновил ответ – rock321987

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

  • Нет связанных вопросов^_^