ホームページ >バックエンド開発 >PHPチュートリアル >[転送] PHP 正規表現: php 正規表現の構文

[転送] PHP 正規表現: php 正規表現の構文

WBOY
WBOYオリジナル
2016-06-23 14:29:24917ブラウズ

転載元: http://blog.csdn.net/kkobebryant/article/details/267527

正規表現の基本構文

まず、2 つの特殊文字を見てみましょう: '^' と '$ 'それぞれ文字列の先頭と末尾を一致させるために使用されます。


"^The": 「The」で始まる文字列と一致します。
"^abc$": abc で始まり abc で終わる文字列と一致します。実際には、abc のみが一致します。
"notice": Notice を含む文字列と一致します

上記の 2 つの文字 (最後の例) は使用されていません。これは、テスト対象の文字列のどこにでもパターン (正規表現) を出現させることができ、両側にロックしないことを意味します
ここにはさらにいくつかの文字 '* '、'+'、および「?」は、それぞれ「0 個以上」、「1 個以上」、「0 個または 1 個」を意味します。 :

"ab*": 文字列 a と 0 個以上の b ("a"、"ab"、"abbb" など) で構成される文字列と一致します。
"ab+": 上記と同じですが、少なくとも 1 つの b ("ab"、"abbb" など);
"ab?": 0 または 1 つの b に一致します。
"a?b+$": 1 つまたは 0 に加えて、複数で終わる文字列に一致します。 b.


"ab{2}" のように、中括弧内に表示される文字の数を制限することもできます。 a の後に 2 つの b (1 つ以上) が一致します )("abb"); "ab{2,}": 少なくとも 2 つの b("abb"、"abbbb" など)

"ab{3,5}": 2-5 b( "abbb"、"abbbb"、または " abbbbb").


また、常に指定する必要があることにも注意してください (つまり、"{,2}" ではなく "{0,2}")。 同様に、'*'、'+' にも注意する必要があります。 、「?」は、それぞれ次の 3 つの範囲アノテーション「{0,}」、「{1,}」、「{0,1}」と同じです。

次に、括弧内に特定の数の文字を入力します。例:

"a(bc)*": a の後に 0 または 1 つの "bc" が続くものと一致します

"a(bc){1,5} ": 1 ~ 5 "bc."



OR 演算に相当する文字 '│' もあります:


"hi│hello": "hi" または "hello" を含む文字列と一致します

"; │cd)ef": "bef" または "cdef" を含む文字列と一致します;

"(a│b)*c": 複数の (0 を含む) a または b の後に c が続く文字列と一致します
文字列 string ;


ドット ('.') はすべての単一文字を表すことができます:


"a.[0-9]": a の後に文字が続き、その後に数字が続きます ( このような文字列を含む文字列が一致します。この括弧は将来省略されます)

"^.{3}$": 3 文字で終わります。



角括弧で囲まれた内容は 1 つの文字にのみ一致します


"[ab]": 1 つの a に一致しますまたは b ("a│b" と同じ);

"[a-d]": 'a' から 'd' までの 1 文字と一致します ("a|b|c| d" および "[abcd]" と同じ)同じ効果);

"^[a-zA-Z]": 文字で始まる文字列と一致します
"[0-9]%": x% 文字列を含む文字と一致します
",[a-zA-Z0-9] $": カンマで終わり、その後に数字または文字が続く文字列と一致します


括弧内に入れたくない文字をリストすることもできます。必要なのは中括弧の先頭に '^' を使用することだけです (例: " %[^a-zA-Z]%" は、2 つのパーセント記号とその中に文字以外の文字を含む文字列に一致します)。

説明のためですが、" ^.[$()│*+?{/"特別な意味を持つ文字として使用される場合は、これらの文字の前に '' を追加する必要があります。また、php3 では、正規表現 "(/$│?[0-9] など、パターンの先頭で / を使用することは避けてください。 +" は ereg("(//$│?[0-9]+", $str) と呼ぶべきです (php4 でも同じかどうかはわかりません)

括弧内の文字はこの規則の例外は? 括弧内では、('') を含むすべての特殊文字はその特殊な特性を失います (つまり、「[*/+?{}. ]」はこれらの文字を含む文字列と一致します)。 us: "リストに ']' が含まれる場合、それをリストの最初の文字 (おそらく '^' に続く) にするのが最善です。 '-' が含まれる場合は、先頭または最後に置くのが最善です。または、範囲の 2 番目の終点 (つまり、[a-d-0-9] 中央の '-' が有効になります。)

完全にするには、照合順序、文字クラス、および等価クラスについて説明する必要があります。しかし、私はそうではありません。これらの側面についてはあまり詳しく説明したくないので、次の記事で説明する必要はありません。正規表現のマニュアル ページ メッセージで詳細を確認できます。

通貨の入力に一致するパターンを構築する方法。金額

さて、ここで学んだことを使って何か役に立つことをする必要があります。入力情報がお金を表す数字かどうかをチェックするための一致パターンを構築します。金額を表す方法は 4 つあると思います。「10000.00」と「10,000.00」、または小数部分を省略した「10000」と「10,000」です。次に、この一致パターンの構築を開始しましょう:

^[1-9]。 ] [0-9]*$

これは、すべての変数が 0 以外の数値で始まる必要があることを意味しますが、単一の「0」ではテストに合格できないことも意味します。 解決策は次のとおりです。

^(0 │[1 -9][0-9]*)$

「0 と 0 で始まらない数字のみが一致する」。数字の前に負号を付けることもできます:

^(0│-?[1- 9][0-9]*)$

これは次のとおりです。「0、またはその前にマイナス記号が付いている 0 で始まる数字。」 さて、それでは、もう少し厳密にして、0 から始まることを許可しましょう。コインを表すときに負符号は必要ないので、ここで小数部分に一致するパターンを指定しましょう:

^[0-9]+(/.[0-9]+)?

これは、一致する文字列が少なくともアラビア数字で始まる必要があることを意味します。ただし、上記のパターンでは「10.」は一致せず、「10」と「10.2」のみが一致することに注意してください (理由はわかりますか)

^ [0-9]+(/.[0-9]{2})?$

上記では、小数点以下 2 桁でなければならないと指定しましたが、これが厳しすぎると思われる場合は、次のように変更できます。 :

^[0-9]+(/.[0-9]{1,2})?$

これにより、小数点の後に 1 文字または 2 文字を追加できるようになります (それぞれ 3 桁離れています)。 、次のように表現できます:

^[0-9]{1,3}(,[0-9]{3})*(/.[0-9]{1,2})?

空白文字列の入力を許可する場合は、プラス記号「+」を乗算記号「*」に置き換えることができます (なぜですか?)。また、表示されるバックスラッシュ「/」も忘れないでください。 PHP 文字列エラー (非常に一般的なエラー)。文字列を確認できたので、すべてのカンマ str_replace(",", "", $money) を削除し、型を double として扱い、それを渡すことができます。

電子メールをチェックするための正規表現の作成


それでは、電子メール アドレスを検証する方法に移りましょう: 完全な電子メール アドレスには 3 つの部分があります: POP3 ユーザー名 (「@」の左側すべて)、「@」。 '、サーバー名 (残りの部分)。ユーザー名には、大文字、小文字、アラビア数字、ピリオド ('.')、マイナス記号 ('-')、およびアンダースコア ('_') も使用できます。もちろん、アンダースコアを除いて、このルールに従います。

ユーザー名の先頭と末尾にピリオドを使用することはできません。また、サーバーについても同様に、間に少なくとも 1 文字のピリオドを入れることはできません。それでは、ユーザー名に一致するパターンを記述する方法を見てみましょう:

^[_a-zA-Z0-9-]+$

ピリオドの存在はまだ許可されていません:

^[_a-zA- Z0-9-]+(/.[_a-zA-Z0-9-]+)*$

上記は、「少なくとも 1 つの標準文字 (. 臨時記号を除く) で始まり、その後に続く」ことを意味します。 by 0 以上 ドットで始まる文字列。"

少し単純化するために、 ereg() の代わりに eregi() を使用できます。 eregi() は大文字と小文字を区別しないため、この 2 つを指定する必要はありません範囲は「a-z」と「A-Z」ですか? 1 つだけ指定します:

^[_a-z0-9-]+(/.[_a-z0-9-]+)*$

の後のサーバー名は同じです。ただし、アンダースコアは削除する必要があります:

^[a-z0-9-]+(/.[a-z0-9-]+)*$

あとは、「@」を使用して 2 つの部分を接続するだけです。

^[_a-z0 -9-]+(/.[_a-z0-9-]+)*@[a-z0-9-]+(/.[a-z0-9-]+)* $

これは完全な電子メール認証マッチング パターンです。


eregi('^[_a-z0-9-]+(/.[_a-z0-9-]+)*@[a-z0-9] を呼び出すだけです。 -]+( /.[a-z0-9-]+)*$ ',$eamil)

メールかどうか取得できる

その他の正規表現の使い方


文字列の抽出

ereg()とeregi( ) 1 つの機能により、ユーザーは正規表現を使用して文字列の一部を抽出できます (具体的な使用法についてはマニュアルを参照してください)。たとえば、パス/URL からファイル名を抽出したい場合は、次のコードが必要です。

ereg("( [^///]*)$", $pathOrUrl, $regs);

echo $regs[1];

高度な置換

ereg_replace() と eregi_replace() も非常に便利です。スペースのある負の記号はすべてカンマに置き換えられます:

ereg_replace("[ /n/r/t]+", ",", trim($str)); PHP は広く使用されています。 Web バックグラウンド CGI の開発では、通常、ユーザーのデータに基づいて特定の結果が得られます。しかし、ユーザーが入力したデータが間違っている場合、たとえば、誰かの誕生日が「2 月 30 日」である場合、問題が発生します。では、夏休みが正しいかどうかはどのように確認すればよいのでしょうか? 正規表現のサポートが PHP に追加され、データ照合を非常に便利に実行できるようになりました。

2 正規表現とは:
簡単に言えば、正規表現はパターンのマッチングと置換に使用できる強力なツールです。正規表現の痕跡は、Perl や PHP スクリプト言語など、UNIX/LINUX システムに基づくほぼすべてのソフトウェア ツールで見つかります。さらに、クライアント側のスクリプト言語である JavaScript も正規表現をサポートしています。現在、正規表現は一般的な概念およびツールとなっており、さまざまな技術者によって広く使用されています。
Linux の Web サイトには次のような記述があります。「Linux 愛好家に何が最も好きかを尋ねると、おそらく正規表現と答えるでしょう。面倒なインストールと構成に加えて、最も恐れていることは何かと尋ねると、彼はこう答えます。」正規表現は間違いなく「正規表現」と言うでしょう。
上で述べたように、正規表現は非常に複雑で怖く見えます。ほとんどの PHP 初心者はこれをスキップして、以下の学習を続けるでしょう。しかし、PHP の正規表現はパターン マッチングを使用できます。そうでないのは残念です。条件を満たす文字列を検索する、文字列が条件を満たすかどうかを判断する、条件を満たす文字列を指定した文字列に置き換えるなどの強力な機能を学びます...


3 正規表現の基本構文:
正規表現は、区切り文字、式、修飾子の 3 つの部分に分かれています。
区切り文字には、特殊文字 (「/!」など) を除く任意の文字を使用できます。一般的に使用される区切り文字は「/」です。この式は、いくつかの特殊文字 (以下の特殊文字を参照) と特殊でない文字列で構成されます。たとえば、「[a-z0-9_-]+@[a-z0-9_-.]+」は、単純な電子メールに一致します。弦。モディファイアは、特定の機能/モードをオンまたはオフにするために使用されます。以下は完全な正規表現の例です:
/hello.+?hello/is
上記の正規表現 "/" は区切り文字、2 つの "/" の間にあるものは式、2 番目の "/ 「is」の後の文字列「is」は修飾子です。
式に区切り文字がある場合は、「/hello.+?//hello/is」のようにエスケープ記号「/」を使用する必要があります。エスケープ記号は区切り文字として使用するだけでなく、特殊文字を実行するためにも使用できます。たとえば、「/d」はすべての数字を表します。


4 正規表現の特殊文字:
正規表現の特殊文字は、メタ文字、位置決め文字などに分類されます。
メタキャラクターは、正規表現において特別な意味を持つ文字の一種であり、一致したオブジェクト内で先頭の文字 (つまり、メタキャラクターの前の文字) がどのように表示されるかを記述するために使用されます。メタキャラクター自体は単一の文字ですが、異なるまたは同一のメタキャラクターを組み合わせて、より大きなメタキャラクターを形成することができます。
メタキャラクター:
中括弧: 中括弧は、一致するメタキャラクターの出現数を正確に指定するために使用されます。たとえば、「/pre{1,5}/」は、一致するオブジェクトが「pre」、「pree」、「preeeee」であることを意味します。 「pr」の後に「e」が1~5個の文字列で表示されます。または、「/pre{,5}/」は、pre が 0 回から 5 回まで出現することを意味します。
プラス記号: 「+」文字は、メタキャラクターが 1 回以上出現する前の文字と一致するために使用されます。たとえば、「/ac+/」は、一致するオブジェクトが、「a」の後に 1 つ以上の「c」が続く「act」、「account」、「acccc」などの文字列である可能性があることを意味します。 「+」は「{1,}」と同等です。
アスタリスク: 「*」文字は、メタキャラクターの前に出現するゼロ個以上の文字と一致するために使用されます。たとえば、「/ac*/」は、一致するオブジェクトが「app」、「acp」、「accp」、および「a」の後に 0 個以上の「c」が出現するその他の文字列である可能性があることを意味します。 「*」は「{0,}」と同等です。
疑問符: 「?」文字は、メタキャラクターの前に出現する 0 個または 1 個の文字と一致するために使用されます。たとえば、「/ac?/」は、一致するオブジェクトが「a」、「acp」、または「acwp」であることを意味します。このように、「a」の後に 0 個または 1 個の「c」文字列が表示されます。 「?」は正規表現、つまり「貪欲モード」でも非常に重要な役割を果たします。

非常に重要な特殊文字が 2 つあります:「[ ]」。たとえば、上記の式を "/[a-z]/" に変更すると、「/[az]/」は単一の文字「a」または「z」に一致します。 「a」、「b」など、任意の小文字 1 文字と一致させることができます。
「[]」に「^」が含まれている場合は、この式が「[]」に含まれる文字と一致しないことを意味します。たとえば、「/[^a-z]/」は小文字と一致しません。そして、正規表現には「[]」のいくつかのデフォルト値が与えられます:
[:alpha:]: 任意の文字に一致
[:alnum:]: 任意の文字と数字に一致
[:digit:]: 任意の数字に一致
[ :space:]: スペース文字と一致します
[:upper:]: 任意の大文字と一致します
[: lower:]: 任意の小文字と一致します
[:punct:]: 任意の句読点文字と一致します
[:xdigit:]: 任意の文字と一致します16 進数

さらに、次の特殊文字は、エスケープ記号「/」でエスケープした後、次の意味を持ちます:
s: 単一のスペース文字と一致します
S: 単一のスペース文字を除くすべての文字と一致するために使用されます。
d: 0 から 9 までの数値を照合するために使用され、「/[0-9]/」と同等です。
w: 文字、数字、またはアンダースコア文字と一致するために使用され、「/[a-zA-Z0-9_]/」と同等です。
W: w に一致しないすべての文字と一致するために使用され、「/[^a-zA-Z0-9_]/」と同等です。
D: 10 進数以外の数字と一致するために使用されます。
.: 改行文字を除くすべての文字と一致するために使用されます。修飾子「s」によって変更された場合、「.」は任意の文字を表すことができます。

上記の特殊文字を使用すると、面倒なパターン マッチングを簡単に表現できます。たとえば、「//d0000/」は上記の正規表現を使用して、10,000 を超えて 100,000 未満の範囲の整数文字列と一致させることができます。

位置決め文字:
位置決め文字は、正規表現におけるもう 1 つの非常に重要なタイプの文字であり、その主な機能は、一致するオブジェクト内の文字の位置を記述することです。
^: 一致するパターンが一致するオブジェクトの先頭に現れることを示します (「[]」とは異なります)
$: 一致するパターンが一致するオブジェクトの最後に現れることを示します
スペース: 一致するパターンが一致するオブジェクトの先頭に現れることを示します先頭と末尾の両方 境界の 1 つ
"/^he/": hello、height など、「he」文字で始まる文字列と一致します
"/he$/": 末尾の文字列と一致します。 「he」文字を使用します。つまり彼女です。
"/ he/": スペースで始まり、^ と同じ効果があります。he で始まる文字列と一致します。
"/he /": スペースで終わります。 、$ と同じ効果があり、he で終わる文字に一致します。
"/^he$/": 文字列「he」にのみ一致することを意味します。

括弧:
正規表現の一致に加えて、括弧「()」を使用して必要な情報を記録し、保存し、後続の式で読み取ることもできます。例:
/^([a-zA-Z0-9_-]+)@([a-zA-Z0-9_-]+)(.[a-zA-Z0-9_-])$/
は記録 メールアドレスのユーザー名と、メールアドレスのサーバーアドレス(username@server.comなどの形式) 記録した文字列を後で読みたい場合は、「エスケープ文字」を使用するだけです。 +録音順」と読みます。たとえば、「/1」は最初の「[a-zA-Z0-9_-]+」に相当し、「/2」は 2 番目の「[a-zA-Z0-9_-]+」に相当します。 「/ 3」は 3 番目 (.[a-zA-Z0-9_-]) です。ただし、PHP では、「/」はエスケープする必要がある特殊文字であるため、PHP 式では「」を「//1」として記述する必要があります。
その他の特殊記号:
「|」: or 記号「|」は PHP の or と同じですが、PHP では 2 つの「||」ではなく 1 つの「|」です。これは、特定の文字または別の文字列である可能性があることを意味します。たとえば、「/abcd|dcba/」は「abcd」または「dcba」と一致する可能性があります。


5 貪欲モード:
メタキャラクターで前述したように、「?」も重要な役割を果たします。つまり、「貪欲モード」とは何ですか?
たとえば、文字「a」で始まり文字「b」で終わる文字列を一致させたいが、一致する必要がある文字列には「a」の後に「b」が多数含まれている場合、「」のようになります。 a bbbbbbbbbbbbbbbbbb" の場合、正規表現は最初の "b" または最後の "b" に一致しますか?貪欲モードを使用する場合は、最後の「b」が照合されます。それ以外の場合は、最初の「b」のみが照合されます。
greedyモードを使用した式は次のとおりです:
/a.+?b/
/a.+b/U
greedyモードを使用しない式は次のとおりです:
/a.+b/
修飾子Uが使用されています上記、詳細は以下のセクションを参照してください。


6 修飾子:
正規表現内の修飾子は、正規表現の多くの特性を変更して、正規表現をニーズにより適したものにすることができます (注: 修飾子では大文字と小文字が区別されます。つまり、「e」は「E」と等しくありません) )。正規表現内の修飾子は次のとおりです。
i: 「i」を修飾子に追加すると、正規表現では大文字と小文字の区別がキャンセルされます。つまり、「a」と「A」は同じになります。
m: デフォルトの通常の開始 "^" と終了 "$" は、通常の文字列のみに使用されます。修飾子に "m" が追加された場合、開始と終了は文字列の各行、つまり各行の先頭を参照します。は「^」で、「$」で終わります。
s: 「s」を修飾子に追加すると、改行文字を除く任意の文字を表すデフォルトの「.」が改行文字を含む任意の文字になります。
x: この修飾子を追加すると、エスケープされていない限り、式内の空白文字は無視されます。
e: この修飾子は置換の場合にのみ役立ちます。つまり、置換の PHP コードとして使用されます。
A: この修飾子を使用する場合、式は一致する文字列の先頭である必要があります。たとえば、「/a/A」は「abcd」と一致します。
E: 「m」とは反対に、この修飾子が使用される場合、「$」は改行文字の前ではなく、文字列の絶対的な末尾と一致します。このモードはデフォルトでオンになります。
U: クエスチョンマークと同じ機能があり、「貪欲モード」を設定するために使用されます。


7 PCRE 関連の正規表現関数:
PHP の Perl 互換正規表現は、パターン マッチング、置換、数値マッチングなどに分かれた複数の関数を提供します:
1. preg_match:
関数形式: int preg_match( string pattern, string subject, array [matches]);
この関数は、文字列内のパターン式を使用して一致します。[regs] が指定された場合、文字列は [regs][0] に記録されます。[regs ][1] は最初の文字列を表します。括弧「()」を使用して記録された文字列、[regs][2] は記録された 2 番目の文字列を表します。 preg は、一致するパターンが文字列内で見つかった場合は "true" を返し、それ以外の場合は "false" を返します。

2. preg_replace:
関数形式:mixed preg_replace(mixed pattern,mixed replace,mixed subject);
この関数は、式パターンに一致する文字列内のすべての文字列を式置換で置き換えます。置換にパターンの一部の文字を含める必要がある場合は、「()」を使用してそれを記録し、「/1」を使用して読み取るだけです。

3. preg_split:
関数の形式: array preg_split(string pattern, string subject, int [limit]);
この関数は、split が単純な正規表現を使用して一致を分割できることだけが異なります。一方、preg_split は完全な Perl 互換の正規表現を使用します。 3 番目のパラメーター制限は、返される修飾された値の数を表します。

4. preg_grep:
関数形式: array preg_grep(string pattern, array input);
この関数は基本的に preg_match と同じですが、preg_grep は指定された配列入力内のすべての要素と一致し、新しい配列を返すことができます。

例として、電子メール アドレスの形式が正しいかどうかを確認します。


function emailIsRight($email) {
if (preg_match("^[_/. 0-9a-z- ]+@([0-9a-z][0-9a-z-]+/.)+[a-z]{2,3}$",$email)) {
return 1;
}
return 0;
}
if(emailIsRight('y10k@963.net')) echo '正解
';
if(!emailIsRight('y10k@ffffff')) echo '不正解
;
? >

上記のプログラムは「正解
不正解」を出力します。

8. Perl 互換の正規表現と PHP の Perl/Ereg 正規表現の違い:
「Perl 互換の正規表現」と呼ばれていますが、PHP の正規表現は、Perl の正規表現と比較するとまだいくつかの違いがあります。 、修飾子「G」は Perl ではすべての一致を表しますが、PHP ではこの修飾子はサポートされていません。
eregシリーズの関数との違いもあります。 eregもPHPで提供されている正規表現関数ですが、pregと比べるとかなり弱いです。

1. 区切り文字と修飾子は必須ではなく、ereg では使用できないため、ereg の機能は preg よりもはるかに弱いです。
2. 「.」について: 正規表現のドットは通常、改行文字を除くすべての文字ですが、ereg の「.」は改行文字を含む任意の文字です。 preg に「.」に改行文字を含めたい場合は、修飾子に「s」を追加します。
3. ereg はデフォルトで貪欲モードを使用するため、多くの置換やマッチングに問題が生じます。
4. 速度: これは多くの人が懸念している質問かもしれません。preg の強力な機能は速度と引き換えですか?心配しないでください、preg は ereg よりもはるかに高速です:

time test:

PHP コード:

echo "Preg_replace used time:"; ;
for($i=1;$i<=100000;$i++) {
$str = "ssssssssssssssssssssssssssssssss"
}
$ended = 時間()-$start;
echo $ended;
echo "
ereg_replace の使用時間:";
for($i=1;$i<=100000;$i++) {
$str = "sssssssssssssssssssssss";
ereg_replace("s",",$str);
$end = time()-$start;
str_replace の使用時間:"; = time();
for($i=1;$i<=100000;$i++) {
$str = "ssssssssssssssssssssssss"
}
$end = time()-$start;
echo $ended
?>
結果:
Preg_replace 使用時間:5
ereg_replace 使用時間:2


str_replace は高速です。 match 非常に高速で、preg_replace は ereg_replace よりもはるかに高速です。


9. PHP3.0 の preg サポートについて:
Preg サポートは PHP 4.0 ではデフォルトで追加されていますが、3.0 では利用できません。 3.0 で preg 関数を使用したい場合は、php3_pcre.dll ファイルをロードする必要があります。php.ini の拡張子セクションに「extension = php3_pcre.dll」を追加して、PHP を再起動するだけです。
実際、正規表現は UbbCode の実装でよく使用されます。多くの PHP フォーラム (zForum zphp.com や vB vbullent.com など) がこの方法を使用しますが、特定のコードは比較的長くなっています。

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