2016-06-17 8 views
0

私の正規表現:PHPの正規表現値

/^(\p{L}+)(?:\.(\p{L}+))*$/ 

と件名:それは返しappdbに一致する

app.config.db 

。なぜこのスクリプトはconfigを省略しますか?このため、一部の

+0

正規表現を投げてhttps://www.regex101.comに入力してください – Rizier123

+0

私は忘れてしまいました;)https://regex101.com/r/jI7cW4/1 – Mati

答えて

2

(?:\.(\p{L}+))* 

あなたしか最後キャプチャをキャプチャしますキャプチャグループを、繰り返しています。あなたはpreg_match_all()を見てみるとよいでしょう。これは(異なる正規表現で)すべての一致を返すことができます。

例:

$input = 'app.config.db'; 
$regex = '/\.?(\p{L}+)/'; 

preg_match_all($regex, $input, $matches); 
print_r($matches[1]); 

出力:

Array 
    (
     [0] => app 
     [1] => config 
     [2] => db 
    ) 
1

あなたの正規表現は、2つのキャプチャグループが含まれているので、それは2つの文字列をキャプチャします。最初のグループ(^(\p{L}+))は、文字列の先頭にあるので、appをキャプチャします。

第2のグループは、当初configをキャプチャします。しかし、それは*内側にネストていますので、それは繰り返されるとdbをキャプチャします。一般的に、結果は、任意のグループによって捕捉最後ストリングであろう。

+0

解決方法はありますか? – Mati

+0

@マーティーなぜ '.'に分割されないのですか?私は100%の確信を持っていると思い – melpomene

+0

(ユーザーは、この「クエリ」を書くことができます)あなたは/\A\p{L}+(?:\.\p{L}+ 'と(最初の入力を検証することができ@Mati – Mati