ホームページ  >  記事  >  バックエンド開発  >  PHP - PCRE 正規表現エスケープ シーケンス (バックスラッシュ)

PHP - PCRE 正規表現エスケープ シーケンス (バックスラッシュ)

伊谢尔伦
伊谢尔伦オリジナル
2016-11-21 17:26:381357ブラウズ

バックスラッシュにはさまざまな用途があります。まず、英数字以外の文字が続く場合、その文字によって表される特別な意味がキャンセルされます。バックスラッシュをエスケープ文字として使用するこの使用は、文字クラスの内部と外部の両方で使用できます。

たとえば、「*」文字を一致させたい場合は、パターンに「*」を記述する必要があります。 これは、エスケープせずに文字が特別な意味を持つ場合に適用されます。 ただし、英数字以外の文字の場合、元のテキストと一致させる必要がある場合は、文字の前にバックスラッシュを追加して、それ自体を表すことを宣言するのが常に安全です。バックスラッシュを一致させたい場合は、パターンで「\」を使用します。

注:

バックスラッシュは一重引用符で囲まれた文字列と二重引用符で囲まれた文字列で特別な意味を持ちます。そのため、バックスラッシュと一致させるには、パターンを「\\」として記述する必要があります。 翻訳注釈: "/\/"、最初は文字列として使用され、バックスラッシュがエスケープされ、エスケープされた結果は // になります。これは正規表現エンジンによって取得されたパターンであり、正規表現エンジンもエスケープタグとみなされ、区切り文字 / をエスケープしてエラーが発生するため、1 つのバックスラッシュと一致するには 4 つのバックスラッシュが必要です。

パターンが PCRE_EXTENDED オプションを使用してコンパイルされている場合、パターン内の空白文字 (文字クラスを除く) およびエスケープされていない # から行末までのすべての文字は無視されます。 この場合、空白文字または # を使用するには、それらをエスケープする必要があります。

バックスラッシュの 2 番目の使用は、非印刷文字の表示エンコーディングを制御する手段を提供します。 非印刷文字 (それ自体) の出現については、バイナリ 0 でパターンが終了することを除いて、厳密な制限はありません。ただし、テキスト エディタを使用してパターンを作成する場合は、バイナリ文字を使用するよりも次のエスケープ シーケンスを使用する方が適切です。もっと簡単に。

a

リング文字(16進数07)

cx

「control-x」、xは任意の文字です

e

エスケープ(16進数1B)

f

ページを置換(16進数0C)

n

改行(16進数0A)

p{xx}

xx属性に適合する文字

P{xx}

xx属性に適合しない文字

r

キャリッジリターン( hex 0D)

t

水平タブ (hex 09)

xhh

hh 16 進数でエンコードされた文字

ddd

ddd 8 進数 エンコードされた文字、または後方参照

cx の正確な効果は次のとおりです。小文字の場合は大文字に変換されます。次に、文字の 6 番目のビット (16 進数の 40、右から最初のビットはビット 0) を反転します。 たとえば、cz は 16 進数で 1A、c{ は 16 進数で 3B、c; は 16 進数で 7B になります。

「x」の後に、2 つの 16 進数を読み取ります (文字は大文字でも小文字でも構いません)。 UTF-8 モードでは、「x{...}」が許可され、中括弧内の内容は 16 進数の有効数字です。 指定された 16 進数を UTF-8 文字コードとして解釈します。元の 16 進エスケープ シーケンス xhh は、値が 127

in より大きい場合、2 バイトの UTF-8 文字と一致します。

水平以外の空白文字 (PHP 5.2.4 以降)

s

空白以外の文字

S

空白以外の任意の文字

v

垂直方向の空白文字 (PHP 5.2.4 以降)

V

垂直以外の空白文字 (PHP 5.2.4 以降)

w

任意の単語文字

W

任意の非単語文字

上記のエスケープ シーケンスの各ペアは、完全な文字セット 部分的には、どの文字もいずれかの文字に必ず一致しますが、もう一方には一致しません。

単語の文字とは、任意の文字、数字、アンダースコアを指します。 つまり、Perl 単語を形成できる任意の文字です。 文字と数字の定義は PCRE 文字テーブルによって制御され、ロケール設定を指定することで一致するように変更できます。たとえば、フランス (fr) ロケールでは、アクセント付き文字に 128 を超える一部の文字コードが使用されており、 w で一致させることができます。

これらの文字クラスのシーケンスは、文字クラスの内部または外部に出現できます。 これらは、それらが表す文字タイプ内で一度に 1 文字と一致します。 現在の一致ポイントがターゲット文字列の末尾にある場合、一致する文字が残っていないため、その中のすべての文字は一致しません。

バックスラッシュの 4 番目の使用法は、いくつかの単純なアサーションです。 アサーションは、特定の位置で一致する必要がある条件を指定します。ターゲット文字列の文字は消費されません。 次に、サブグループを使用したより複雑なアサーションについて説明します。 バックスラッシュ アサーションには以下が含まれます:

b

単語境界

B

非単語境界

A

ターゲットの開始位置 (複数行モードとは独立)

Z

終了位置またはターゲット改行文字の終わり(複数行モードから独立)

z

ターゲットの終了位置 (複数行モードから独立)

G

ターゲット内の最初の一致の位置

これらのアサーションは文字クラスには現れません (ただし、「b」は異なることに注意してください)文字クラスでの意味。バックスペース文字を表します)

単語境界は、ターゲット文字列内で、現在の文字と前の文字が異なり、w または W に一致する (a は w に一致、1 つは W に一致)、または現在の文字列に一致することを示します。文字は、文字列の開始文字または終了文字としての w と一致します。

A、Z、z アサーションは、ターゲット文字列の先頭と末尾に常に一致し、パターン修飾子によって制限されないという点で、従来の ^ や $ (以下を参照) とは異なります。 これらは、PCRE_MULTILINE、PCRE_DOLLAR_ENDONLY オプションの影響を受けません。 Z と z の違いは、文字列の末尾文字が改行文字の場合、Z は文字列の末尾として一致するのに対し、z は文字列の末尾のみと一致することです。

G $offset パラメータを指定した preg_match() 呼び出しでは、現在の一致位置が一致開始点にある場合にのみ成功することをアサートします。 $offsetの値が0以外の場合はAとは異なります。 翻訳注: A とのもう 1 つの違いは、preg_match_all() を使用する場合、G が一致するたびに、それが一致結果の開始位置であるかどうかのみをアサートするのに対し、A は一致結果の開始位置が先頭にあるかどうかをアサートすることです。ターゲット文字列の。

PHP 4.3.3 以降、Q と E を使用してパターン内の正規表現メタ文字を無視できるようになりました。たとえば、w+Q.$.E$ は 1 つ以上の単語文字に一致し、その後にピリオド、$、ピリオドが続き、最後に文字列の末尾にアンカーされます。

PHP 5.2.4以降。 K を使用してマッチングをリセットできます。 たとえば、footKbar は「footbar」と一致します。 しかし、マッチング結果は「bar」です。ただし、K の使用はサブグループ内のコンテンツには影響しません。たとえば、(foot)Kbar が「footbar」と一致する場合、最初のサブグループの結果は依然として「foo」になります。翻訳者注: サブグループ内とサブグループ外に配置された K の効果は同じです。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。