2016-08-08 4 views
-1

PHPを使用して、さまざまな単語やパターンが文字列内に存在するかどうかをテストしようとしていますが、特定の単語に一致させるとき、preg_matchが何らかのリテラルワードを見つけられないのはなぜですか?

例1: なぜ次は1を返しませんか?

$test = 'clen=a.le​ngth;for(i=0;i<clen;i++)b+=St​ring.fr​omCh​arCode(a.char​CodeAt(i)^2)'; 

$result = preg_match('/(string)/i', $test, $matches); 

$結果は、単語「文字列は」対象文字列中に存在しているにもかかわらず、常に上記のためにゼロです。

例2: しかし、のは、私は少し以下に私の正規表現を変更しましょう:$結果の1の

$test = 'clen=a.le​ngth;for(i=0;i<clen;i++)b+=St​ring.fr​omCh​arCode(a.char​CodeAt(i)^2)'; 
$result = preg_match('/st.+(ring)/i', $test, $matches); 

上記の戻り値。 "文字列"という言葉を別々の部分に分けたときのように、私はマッチを得ることができます。

例3:私は少しこの例では正規表現を変更する場合 はもう一度、それはまた、ゼロを返しますが、私はなぜわからない:そのような文字の配列に一致するようにしよう

$test = 'clen=a.le​ngth;for(i=0;i<clen;i++)b+=St​ring.fr​omCh​arCode(a.char​CodeAt(i)^2)'; 
$result = preg_match('/(tring)/i', $test, $matches); 

"tring"は0を返しますが、 "ring"にマッチすると1を返します。しかし、 "tring"は特別な単語や予約語のようには聞こえません!

この動作は、 "document"や "unescape"などの他のさまざまな単語でも同じですが、他にもたくさんあります。

私は一部の単語が正規表現エンジンによって多分扱われていると仮定していますが、それは何らかの方法で予約されているか特殊なものかもしれないが、私は上記の動作についての正式な説明を見つけることができませんでした。

私は本当に明白なものを紛失している場合は謝罪し、誰かが私にこれを説明することができれば本当に感謝します。 多くのありがとうございます。

答えて

1

あなたの最初の正規表現は問題ないと思います。ここを見てください https://regex101.com/r/tO9vN8/1

しかし、文字セットに問題があるようですが、私は式を書き直さなければならなかった - 私はこのサイトからコピーすると、正規表現は一致しませんでした。

私はこれが正しい方向になることを願っています...

+0

あなたは正しいです。私の件名の文字列をメモ帳の中に貼り付けたとき、私は以前に見ることができなかった様々な隠し文字を見ることができました。 「String」という言葉が「St?ring」として登場しました。したがって、regexとpreg_matchはうまく動作します。ありがとう! – user3109890

関連する問題