2016-05-29 33 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

你在有额外的空间(但之后没有空格3210使得整个正则表达式失败)

((?:[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