PHP を使用して、文字列内のさまざまな単語やパターンの存在をテストしようとしていますが、特定の単語を一致させようとしたときに奇妙な動作が見られる理由を理解できません。
例 1 : 以下が 1 を返さないのはなぜですか?
$test = 'clen=a.length;for(i=0;i<clen;i++)b+=String.fromCharCode(a.charCodeAt(i)^2)';
$result = preg_match('/(string)/i', $test, $matches);
$result は、対象の文字列に "String" という単語が存在する場合でも、上記の場合は常にゼロです。
例 2 : ただし、正規表現を次のように少し変更するとします。
$test = 'clen=a.length;for(i=0;i<clen;i++)b+=String.fromCharCode(a.charCodeAt(i)^2)';
$result = preg_match('/st.+(ring)/i', $test, $matches);
上記は $result の値 1 を返します。「文字列」という単語を別々の部分に分割すると、一致するようです。
例 3 : この例の正規表現を少し変更すると、ゼロも返されますが、理由はわかりません。
$test = 'clen=a.length;for(i=0;i<clen;i++)b+=String.fromCharCode(a.charCodeAt(i)^2)';
$result = preg_match('/(tring)/i', $test, $matches);
「tring」などの一連の文字で一致させようとすると 0 が返されますが、「ring」で一致すると 1 が返されます。しかし、「tring」は特殊な単語や予約語のようには聞こえません。
この動作は、「ドキュメント」や「アンエスケープ」など、他のさまざまな単語でも同じであり、他にもたくさんあると思います。
一部の単語は、何らかの形で予約されているか特別なものである可能性があるため、おそらく正規表現エンジンによって異なる扱いを受けていると思いますが、上記の動作の公式の説明を見つけることができませんでした.
本当に明白な何かが欠けている場合はお詫び申し上げます。誰かが私にこれを説明していただければ、本当に感謝しています。どうもありがとう。