原文: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4101636
正規表現をうまく使用すると、多くの場合、半分の労力で 2 倍の結果が得られます。以下は、PHP 正規表現 の構文の概要と詳細な紹介です。 まず、2 つの特殊文字を見てみましょう: '^' と '$' は、それぞれ文字列の先頭と末尾を一致させるために使用されます。
"^The": の例を次に示します。 " "The" で始まる文字列;
"of death$": "of destroy" で終わる文字列と一致します;
"^abc$": abc で始まり abc で終わる文字列と一致します、実際にはのみabc はそれに一致します
"notice": Notice を含む文字列と一致します
前述した 2 つの文字 (最後の例)、つまりパターン (
正規表現 ) を使用しない場合、それがわかると思います。テスト対象の文字列のどこにでも出現できますが、両側にロックしていませんいくつかの文字「*」、「+」、「?」もあります。これらは、文字が出現できることを示すために使用されます。それぞれ、「0 個以上」、「1 個以上」、「0 個以上」を意味します:
"ab*": 文字列 a と 0 個以上の A 文字列に一致します。複数の b (「a」、「ab」、「abbb」など) で構成されます。
「ab+」: 上記と同じですが、少なくとも 1 つの b (「ab」、「abbb」など) ;
: 0 または 1 つの b に一致します。
: 1 または 0 a と 1 つ以上の b で終わる文字列に一致します。中かっこで囲まれた文字の組み合わせ。例:
"ab{2}": a の後に 2 つの b が続くもの ("abb"
; ![PHP 正規表現構文の概要](http://image.codes51.com/Article/image/20151204/20151204143322_8103.gif)
"ab{3,5}": 2-5 b("abbb"、"abbbb"、または "abbbbb"
.
。同様に、次の点に注意する必要があります。
「*」、「+」、「?」は、それぞれ次の 3 つの範囲アノテーション「{0,}」、「{1,}」、「{0,1}」と同じです。
ここで、括弧内に特定の数の文字を入れます。例:
"a(bc)*": a の後に 0 または 1 つの "bc" が続くものと一致します
"a(bc){1 ,5 }": 1 ~ 5 つの "bc."
と 1 つの文字 '│'、OR 演算に相当:
"hi│hello": "hi" または "hello" を含む文字列に一致 ;
"( b│cd)ef": "bef" または "cdef" を含む文字列と一致します。
"(a|b)*c": 複数の (0 を含む) a または b の後に c の文字列が続く文字列と一致します。
;
ドット ('.') はすべての単一文字を表すことができます:
"a.[0-9]": an a 続いて文字と数字が続きます (このような文字列を含む文字列は一致する場合、この括弧は将来省略されます)
"^.{3}$": 3 文字で終わります
角括弧 コンテンツは 1 つの文字のみと一致します
"[ab]":単一の a または b (「a│b」と同じ) に一致します。
"[a-d]": 'a' から 'd ' に一致します (「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 でも同じかどうかはわかりません) )
角括弧内の文字はこの規則の例外であることを忘れないでください。角括弧内のすべての特殊文字 ('') は、その特殊なプロパティを失います (例: "[*/ +?{}.]" は、これらの文字を含む文字列に一致します)。また、regx マニュアルに記載されているように、「リストに ']' が含まれている場合は、それをリストの最初の文字として置くのが最善です (おそらく「^」の後に「-」を含める場合は、先頭または最後に置くことをお勧めします。
または、範囲の 2 番目の終点 (つまり、中央に「-」がある [a-d-0-9] が機能します。
完全を期すために、照合順序、文字クラス、および等価クラスに関連付ける必要があります。しかし、私はこれらの側面についてはあまり詳しく説明したくありません。また、次の記事で説明する必要もありません。詳細については、正規表現のマニュアル ページを参照してください。
通貨金額の入力を照合します
さて、ここで学んだことを使って何か役に立つことをしてみます。入力情報がお金を表す数値かどうかをチェックする照合パターンを構築します。金額を表すには 4 つの方法があると考えられます。「10000.00」と「10,000.00」、または小数部分を省略した「10000」と「10,000」です。次に、この一致パターンの構築を開始しましょう:
^[1- 9 ][0-9]*$
これは、すべての変数が 0 以外の数値で始まらなければならないことを意味しますが、これは 1 つの「0」ではテストに合格できないことも意味します。 解決策は次のとおりです。
^ (0 │[1-9][0-9]*)$
「0 と 0 で始まらない数字のみが一致します」。数字の前に負号を付けることもできます:
^(0 │ -?[1-9][0-9]*)$
これは、「0 または 0 で始まる数字の前にマイナス記号が付いている可能性があります。」 strict. は 0 から始めることができます。コインを表すときに負の符号は必要ないので、ここで小数部分と一致するパターンを指定します:
^[0-9]+( /.[ 0-9]+)?$
これは、一致する文字列が少なくとも 1 つのアラビア数字で始まる必要があることを意味します。ただし、上記のパターンでは「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 として扱います。それを通じて数学的な計算を行うことができます
電子メールをチェックするための正規表現を構築します
それでは、電子メール アドレスを検証する方法について引き続き説明します。 POP3 ユーザー名 ( すべて。ユーザー名には、大文字と小文字、アラビア数字、ピリオド (「.」)、マイナス記号 (「-」)、およびアンダースコアを含めることができます。 ('_') サーバー名もこのルールに従いますが、もちろんアンダースコアを除きます。また、ユーザー名の間にピリオドを 2 つ連続して入れることはできません。は少なくとも 1 文字であるため、ユーザー名に一致するパターンを記述する方法を見てみましょう:
^[_a-zA-Z0-9-]+$
ピリオドの存在はまだ許可されていません追加しましょう:
^[_a-zA-Z0-9-]+(/.[_a-zA-Z0-9-]+)*$
上記は、「少なくとも 1 つ正規文字 (予期しないものを除く) の後に、ドットで始まる 0 個以上の文字列が続きます。」
少し単純化するために、 ereg() の代わりに eregi() を使用できます。 eregi() は大文字と小文字を区別しません。 「a-z」と「A-Z」の 2 つの範囲を指定する必要はなく、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() には、正規表現を使用して文字列の一部を抽出できる機能があります (具体的な使用法マニュアルを読むことができます)。たとえば、パス/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 愛好家に何が一番好きかを尋ねたら、彼はおそらく正規表現と答えるでしょう。もし彼に面倒なインストールと設定以外に最も恐れていることは何かと尋ねれば、彼は正規表現と答えるでしょう。 、彼は間違いなく
正規表現 と言うでしょう。"
上で述べたように、正規表現は非常に複雑で怖く見えますが、済南ウェブサイト構築 http://www.geilijz.com 私が言いたいのは、ほとんどのPHP初心者はここをスキップして、以下で学習を続けてください。ただし、PHP の正規表現は、パターン マッチングを使用して、条件を満たす文字列を検索したり、文字列が条件を満たすかどうかを判断したり、条件を満たす文字列を指定した文字列に置き換えたりすることができます。強力な関数を学ぶには...
3 正規表現の基本構文:
正規表現は、区切り文字、式、修飾子の3つの部分に分かれています
区切り文字には任意の文字を使用できます。 特殊文字(「/!」など)を除きます。一般的に使用される区切り文字は、いくつかの特殊文字(特殊文字の詳細を参照)と非- 「[a-z0-9_-]+@[a-z0-9_-.]+」などの特殊な文字列は、単純な電子メール文字列と一致します。修飾子は、特定の機能/モードをオンまたはオフにするために使用されます。完全な 正規表現の例を次に示します:
/hello.+?hello/is
上記の 正規表現"/" は区切り文字です。"/" の間にあるものは、式に続き、2 番目の「/」の後の文字列「is」は修飾子です。式に区切り文字がある場合は、「/hello.+?」などのエスケープ記号「/」を使用する必要があります。 //hello/is"。エスケープ記号は、区切り文字として使用するだけでなく、特殊文字
にも使用できます。文字で構成されるすべての特殊文字は、「/」でエスケープする必要があります。たとえば、「/d」 " はすべての数字を表します。 4 正規表現内の特殊文字
: 正規表現内の特殊文字は、メタキャラクター、位置決め文字などに分類されます。 メタキャラクターは、特別な意味を持つ文字の一種です。
正規表現。一致するオブジェクト内で先頭の文字 (つまり、メタキャラクターの前の文字) がどのように表示されるかを記述するために使用されます。メタキャラクター自体は単一の文字ですが、異なるまたは同一のメタキャラクターを組み合わせて形成することができます。大きなメタキャラクター: 中括弧: 中括弧は、一致するメタキャラクターの出現数を正確に指定するために使用されます。たとえば、「/pre{1, 5}/」は、一致するオブジェクトが「pre」である可能性があることを意味します。 「pree」、「preeeee」。「pr」の後に「e」が 0 回から 5 回出現することを表します。 「+」文字は、1 回以上出現するメタ文字の前の文字と一致するために使用されます。たとえば、「/ac+/」は、一致するオブジェクトが「act.」、「account」、「acccc」などであることを意味します。 「a」の後に 1 つ以上の「c」が出現する文字列。「+」は「{1,}」と同等です。
アステリックス: 「*」文字は、メタキャラクターの前に出現する 0 個以上の文字と一致するために使用されます。 。たとえば、「/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 :]: 任意の句読点と一致します [
digit:]: 任意の 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 つの非常に重要なタイプの文字です。その主な機能は、一致するオブジェクト内の文字の位置を記述することです。 ^:一致するパターンが一致するオブジェクトの先頭に現れることを示します(「[]」とは異なります) $:一致するパターンが一致するオブジェクトの最後に現れることを示します スペース:一致するパターンが先頭と末尾の間の 2 つの境界の 1 つで表示されること "/^he/": hello、height などの「he」文字で始まる文字列と一致することができます ; "/he$/": "he" 文字で終わる文字列 (つまり、she など) と一致します。 "/ he/": スペースで始まり、^ と同じ効果があり、で始まる文字列と一致します。 he; "/he /": スペース End、$ と同じ機能を持ち、he で終わる文字列に一致します。 "/^he$/": 文字列「he」のみに一致することを示します。 括弧: 正規表現 ユーザーマッチングに加えて、括弧「()」を使用して必要な情報を記録し、保存し、後続の式で読み取ることもできます。例: /^([a-zA-Z0-9_-]+)@([a-zA-Z0-9_-]+)(.[a-zA-Z0-9_-])$/ は電子メール アドレスを記録するユーザー名であり、記録された文字列を後で読みたい場合は、電子メール アドレスのサーバー アドレス (service@geilijz.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 bbbbbbbbbbbbbbbb" とすると、 正規表現 式 は最初の "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(混合パターン、混合置換、混合主題); この関数は、式パターンに一致する文字列内のすべての文字列を式置換で置き換えます。置換にパターンの一部の文字を含める必要がある場合は、「()」を使用してそれを記録し、「/1」を使用して読み取るだけです。 3. preg_split: 関数の形式: array preg_split(string pattern, string subject, int [limit]); 正規表現
は一致した文字列を分割しますが、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@fffff')) echo 'Incorrect
';
?> 上記のプログラムは「Correct
Incorrect」と出力します。8. PHPのPerl互換正規表現とPerl/Ereg正規表現の違い: 「Perl互換正規表現」とは呼ばれていますが、Perlの正規表現とは異なります。 PHP と比較すると、まだいくつかの違いがあります。たとえば、修飾子「G」は Perl ではすべての一致を表しますが、PHP ではこの修飾子はサポートされていません。 eregシリーズの関数との違いもあります。 eregもPHPで提供されている正規表現関数ですが、pregと比べるとかなり弱いです。 1. 区切り文字と修飾子は必須ではなく、ereg では使用できないため、ereg の機能は preg よりもはるかに弱いです。 2. 「.」について: 正規表現のドットは通常、改行文字を除くすべての文字ですが、ereg の「.」は改行文字を含む任意の文字です。 「.」に改行文字を含めたい場合は、修飾子に「s」を追加します。 3. ereg はデフォルトで貪欲モードを使用するため、多くの置換やマッチングに問題が生じます。 4. 速度: これは多くの人が懸念している質問かもしれませんが、preg の強力な機能は速度と引き換えですか?心配しないでください、preg は ereg よりもはるかに高速です。作成者はプログラム テストを作成しました: time test: PHP コード: 次のようにコードをコピーします:
echo "
reg_replace
time:";
$start = time();
for($i=1;$i
$str = "ssssssssssssssssssssssss"; used
場所( "/s/","",$str);
$ended = time()-$start;
echo "
ereg_replace の使用時間:" ;
$start = time();
for($i=1;$i
$str = "sssssssssssssssssss";場所(「」 , "",$str);
$ended = time()-$start;
echo "
$ start = time();
for($i=1;$i
$str = "ssssssssssssssssssssssss"; ) ;
}
$ended = time()-$start;
echo $ended; ereg_replace 使用時間:2
str_replace は非常に高速ですマッチングは必要なく、preg_replace は ereg_replace よりもはるかに高速です
9. PHP3.0 の preg サポートについて:
PHP 4.0 ではデフォルトで追加されていますが、3.0 では使用できません。 3.0 の preg 関数では、php3_pcre.dll ファイルをロードし、php.ini.dll の拡張子セクションに「extension = php3_pcre.」を追加して、PHP を再起動する必要があります!
実際、正規表現
はUbbCode の実装でもよく使用されます。多くの PHP フォーラムでこの方法が使用されていますが、特定のコードは比較的長いです 。
上記では、特殊文字や正規表現を含む PHP 正規表現構文の概要を紹介しました。PHP チュートリアルに興味のある友人に役立つことを願っています。