2016-05-29 8 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}を付ける理由は、1つまたは2つの単語に一致させたいからですが、少なくとも1つ。スペースを削除すると、1単語だけが一致するようになります。 – frosty

+0

@frostyも答えを更新しました – rock321987

関連する問題