2017-08-18 13 views
0

誰かが私に手を差し伸べてください。私は以下の出力シンプルな正規表現パターンの混乱

$pattern = "#([a-z])*|(chol)#"; 
preg_match($pattern, 'chol',$m); 

print_r($m) // array 
       (
        [0]=> 'chol', 
        [1]=> 'l' 
       ) 

を取得していますなぜ、なぜ完全一致がcholいる間にマッチした最初のサブキャプチャが唯一l文字です。私は何かを逃しているかもしれません。 私はパターンが私を混同し過度に複雑であるとは思わない

array 
     (
     [0]=> 'chol', 
     [1]=> 'chol' 
     ) 

以下この出力を期待しました。

+0

私は結果を 'preg_replace_callback'でさらに操作したいと思います。下の私の答えを参照してください。それはなぜグループ内ではなくグループ内の原子を定量化する必要があるのか​​、そして交互作用の順序が重要であることを説明しています。 –

答えて

3

グループを定量化しました。文字クラス[a-z]を数値化する必要があります。

使用

$pattern = "#([a-z]*)|(chol)#"; 

Repeating a Capturing Group vs. Capturing a Repeated GroupPHP demoと詳細をご覧ください。要するに、([a-z]*)は、0以上の小文字のASCII文字をグループ1に一致させてキャプチャします。([a-z])*は、結果として0文字以上の小文字のASCII文字を一致させてキャプチャし、前の各オカレンスを上書きします新しいものと一緒に。

冗長なキャプチャグループを使用していない場合は、それらを削除することも考えられます。

さらに、これは固定されていないため、[a-z]*は常にcholと一致し、2番目の選択肢は決して一致しないことに注意してください。 (chol)第1の代替方法としてのように入れてください。より具体的にはです。だから、

、私はRemember That The Regex Engine Is Eagerで、この上

$pattern = "#(chol)|([a-z]*)#"; 

詳細を示唆しています。

+0

これは正しい答えです。 – catbadger

+1

これはこの現象を説明していますか? –

+0

@CholthiPaulTtiopicはい、そうです。 –