PHP における正規表現の単語境界の謎を明らかにする
テキスト内の特定の単語を見つけるために正規表現を利用する場合、多くの場合、指定された単語が単語単位の始まりを示すか終わりを示すかに関する制約。ただし、単語の境界を使用してこれを実装しようとすると、予期しない動作が発生する可能性があります。
次の正規表現を考えてみましょう:
preg_match("/(^|\b)@nimal/i", "something@nimal", $match);
グループ化式は消費するため、一致は失敗すると予想されます。 「@」記号を使用し、「nimal」を「@nimal」と照合するように残しますが、これは照合すべきではありません。ただし、この例では、グループ化式が空の文字列と一致し、「@nimal」の一致を許可しています。これは、「@」が単語の一部として扱われることを意味します。
この謎を解明するには、理解することが重要です。 PHP の単語境界がどのように決定されるか。単語境界 (b) は、単語文字 (w) と非単語文字 (W) の間の遷移点を表します。単語の先頭で始まる必要がある単語と一致するには、追加の単語文字が予期される単語の前にある必要があります。
したがって、最初の例では、
something@nimal ^^
があるため、一致は成功します。文字「g」と「@」記号の間の単語の境界。ただし、2 番目のインスタンスでは、
something!@nimal ^^
「!」があるため、マッチングは失敗します。および「@」記号は両方とも非単語文字であるため、単語の境界はありません。これを解決するには、次の正規表現を使用します。
preg_match("/g\b!@\bn/i", "something!@nimal", $match);
この式では、「@」の前に単語文字が必要で、「@」の後に単語文字が必要です。これにより、「@」が表示される場合にのみ一致することが保証されます。一言以内に。
以上がPHP の単語境界は単語以外の文字をどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。