残念ながら、何らかの奇妙な理由で、UTF-8 で正規表現メソッドが機能しません ( preg_replace + UTF-8 は、あるサーバーでは機能しませんが、別のサーバーでは機能します)。
正規表現を使用せずに私の目標を達成する最も効率的な方法は何ですか?
できるだけ明確にするために、次の一連の単語について説明します:
cat、dog、sky
猫は false を返します
空は青です true を返します
スカイリムは false を返します
残念ながら、何らかの奇妙な理由で、UTF-8 で正規表現メソッドが機能しません ( preg_replace + UTF-8 は、あるサーバーでは機能しませんが、別のサーバーでは機能します)。
正規表現を使用せずに私の目標を達成する最も効率的な方法は何ですか?
できるだけ明確にするために、次の一連の単語について説明します:
cat、dog、sky
猫は false を返します
空は青です true を返します
スカイリムは false を返します
非常に短い例ですが、正規表現なしで行う方法です。
$haystack = "cats"; //"the sky is blue"; // "skyrim";
$needles = array("cat", "dog", "sky");
$found = false;
foreach($needles as $needle)
if(strpos(" $haystack ", " $needle ") !== false) {
$found = true;
break;
}
echo $found ? "A needle was found." : "A needle was not found.";
私の最初の考えは、スペースでテキストを分解し、結果の配列に単語が存在するかどうかを確認することです。もちろん、句読点が配列に漏れている可能性もありますが、これも考慮する必要があります。
strpos
別のアイデアは、単語のをチェックすることです。見つかった場合は、次の文字をテストして文字かどうかを確認します。文字の場合は、単語のサブテキストを見つけたことがわかり、この発見を破棄します。
// Test online at http://writecodeonline.com/php/
$aWords = array( "I", "cat", "sky", "dog" );
$aFound = array();
$sSentence = "I have a cat. I don't have cats. I like the sky, but not skyrim.";
foreach ( $aWords as $word ) {
$pos = strpos( $sSentence, $word );
// If found, the position will be greater than or equal to 0
if ( !($pos >= 0) ) continue;
$nextChar = substr( $sSentence , ( $pos + strlen( $word ) ), 1 );
// If found, ensure it is not a substring
if ( ctype_alpha( $nextChar ) ) continue;
$aFound[] = $word;
}
print_r( $aFound ); // Array ( [0] => I [1] => cat [2] => sky )
もちろん、より良い解決策は、正規表現を使用できない理由を判断することです。これらの解決策は、パターン探索ほど効率的ではないためです。
単語が文字列に含まれているかどうかを単純に調べようとしている場合は、文字列を変数に格納し (文字列を印刷する場合は、代わりに文字列を含む変数を印刷します)、"in" を使用します。例:
a = 'The sky is blue'
The in a
True