2014-10-29 68 views
1

我似乎無法保持在簡單的PHP preg_match中捕獲時間段!preg_match捕捉週期。在非捕獲組

$pattern = '/(st(?:\.)?)/i'; 
preg_match($pattern, '1617 5th ST.',$match); 

var_dump($match); 

打印:

array(2) { [0]=> string(3) "ST." [1]=> string(3) "ST." } 

這到底是怎麼回事?

+0

你爲什麼捕捉'st'?一個簡單的'/ st \。?/'是同樣的事情。 – sln 2014-10-29 18:26:53

+0

好問題: /(st(?:\.|reet)?|b(?:lvd\.?|oulevard))/i等地址匹配 – blisstdev 2014-10-29 18:57:59

+0

'/ st(?:(?= \。) | reet)?| b(?:lvd(?= \。)| oulevard)/ i'巴姆,沒有點,沒有捕獲組。 – sln 2014-10-29 19:03:10

回答

1

您有一個非捕獲組放置在捕獲組內,因此它將成爲捕獲的匹配結果的一部分。爲避免這種情況,您可以將可選點放置在捕獲組之外。

(st)\.? 
0

使用向前看,而不是

$pattern = '/(st(?=\.))/i'; 
preg_match($pattern, '1617 5th ST.',$match); 

var_dump($match); 

比賽只ST

0
(st)(?:\.)? 

你需要的是this.Your正則表達式(st(?:\.)?)這裏.

      ^^ 
         group1 group2(non capturing but inside group1) 

羣體是越來越抓獲連同你已經要求你的第二組不被捕獲。