PHP正規表現の高速学習法

WBOY
リリース: 2016-06-13 13:13:41
オリジナル
823 人が閲覧しました

PHP 正規表現を学ぶ簡単な方法
1. はじめに

簡単に言えば、正規表現はパターンのマッチングと置換に使用できる強力なツールです。正規表現は、vi エディター、Perl または PHP スクリプト言語、awk または sed シェル プログラムなど、UNIX システムに基づくほとんどすべてのツールで見つけることができます。さらに、JavaScript などのクライアント側スクリプト言語も正規表現のサポートを提供します。正規表現は、特定の言語やシステムの制限を超えて、広く受け入れられた概念と機能になっていることがわかります。
正規表現を使用すると、ユーザーは一連の特殊文字を使用して一致パターンを構築し、その一致パターンをデータ ファイル、プログラム入力、WEB ページ フォーム入力などのターゲット オブジェクトと比較し、比較オブジェクトに次のものが含まれるかどうかを判断できます。一致するパターンを選択し、対応するプログラムを実行します。
たとえば、正規表現の最も一般的な用途の 1 つは、ユーザーがオンラインで入力した電子メール アドレスの形式が正しいかどうかを確認することです。ユーザーの電子メール アドレスの形式が正しいことを確認するために正規表現が使用されている場合、ユーザーが入力したフォーム情報は通常どおり処理されます。それ以外の場合、ユーザーが入力した電子メール アドレスが正規表現パターンと一致しない場合は、正しい電子メール アドレスを入力するように求めるプロンプト メッセージがポップアップ表示されます。 WEBアプリケーションの論理判断において正規表現が重要な役割を果たしていることが分かります。

2. 基本構文

正規表現の機能と効果を予備的に理解した後、正規表現の構文形式を詳しく見てみましょう。
正規表現の形式は一般に次のとおりです。
/love/
「/」区切り文字で囲まれた部分は、ターゲット オブジェクト内で照合されるパターンです。ユーザーは、一致するオブジェクトを検索するパターンの内容を「/」区切り文字の間に入れるだけで済みます。ユーザーがパターンの内容をより柔軟にカスタマイズできるようにするために、正規表現は特別な「メタキャラクター」を提供します。いわゆるメタキャラクタは、正規表現において特別な意味を持つ特殊文字を指します。これを使用して、ターゲット オブジェクト内で先頭の文字 (つまり、メタキャラクタの前にある文字) の出現パターンを指定できます。
より一般的に使用されるメタ文字には、「+」、「*」、「?」などがあります。このうち、「+」メタキャラクタは、その先頭文字が対象オブジェクト内で 1 回以上出現する必要があることを規定し、「*」メタキャラクタは、その先頭文字が対象オブジェクト内で 0 回または連続して複数回出現する必要があることを規定します。 「?」文字は、その前のオブジェクトがターゲット オブジェクト内に 0 回または 1 回出現する必要があることを指定します。
ここで、正規表現メタキャラクターの具体的な用途を見てみましょう。
/fo+/
上記の正規表現には「+」メタキャラクターが含まれているため、対象オブジェクト内で文字 f の後に「fool」、「fo」、または「football」と連続して出現できることを意味します。複数の文字 o を含む文字列と一致します。
/eg*/
上記の正規表現には「*」メタキャラクターが含まれているため、対象オブジェクト内でゼロが出現する「easy」、「ego」、「egg」で使用できることを意味します。文字 e の後に連続して続く 1 つ以上の文字 g の文字列と一致します。
/Wil?/
上記の正規表現には「?」メタキャラクタが含まれているため、対象オブジェクトの「Win」や「Wilson」などと一致することを意味します。文字 i 文字列内の文字 l と一致します。
メタキャラクターに加えて、ユーザーは一致したオブジェクトにパターンが出現する頻度を正確に指定できます。たとえば、
/jim{2,6}/
上記の正規表現は、文字 m が一致するオブジェクト内に 2 ~ 6 回連続して出現できることを規定しているため、上記の正規表現は次のように比較できます。 jimmy や jimmmmy などの文字列が一致します。
正規表現の使用方法を予備的に理解した後、他のいくつかの重要なメタ文字の使用方法を見てみましょう。
s: タブ キーや改行文字を含む単一のスペース文字の一致に使用されます。
S: 単一のスペース文字を除くすべての文字の一致に使用されます。
d: 0 から 9 の数字の一致に使用されます。
w: 文字、数字、またはアンダースコア文字の一致に使用されます。
W: w に一致しないすべての文字の一致に使用されます。
.: 改行文字を除くすべての文字の一致に使用されます。
(注: s と S、および w と W は相互の逆演算と考えることができます)
以下では、例を通して正規表現で上記のメタキャラクターを使用する方法を見ていきます。
/s+/
上記の正規表現は、ターゲット オブジェクト内の 1 つ以上のスペース文字と一致するために使用できます。
/d000/
複雑な財務諸表がある場合、上記の正規表現を使用して、合計数千ドルのすべての金額を簡単に見つけることができます。

上で紹介したメタキャラクターに加えて、正規表現にはロケーターという別の固有の特殊文字もあります。ロケーターは、ターゲット オブジェクト内で一致するパターンが現れる場所を指定するために使用されます。
より一般的に使用されるロケーターには、「^」、「$」、「b」、「B」などがあります。このうち、「^」ロケーターは、一致するパターンがターゲット文字列の先頭に出現する必要があることを指定し、「$」ロケーターは、一致パターンがターゲット オブジェクトの末尾に出現する必要があることを指定し、b ロケーターは、一致するパターンがターゲット オブジェクトの末尾に出現する必要があることを指定します。一致するパターンは、ターゲット文字列の先頭または末尾の 2 つの境界のいずれかに出現する必要がありますが、「B」ロケーターは、一致するオブジェクトがターゲット文字列の先頭と末尾の 2 つの境界内に存在する必要があると規定しています。つまり、一致するオブジェクトをターゲット文字列の先頭または文字列の末尾として使用することはできません。同様に、「^」と「$」、「b」と「B」も、互いに逆演算である 2 セットのロケーターとみなすことができます。例:
/^hell/
上記の正規表現には「^」ロケーターが含まれているため、ターゲット オブジェクト内の「hell」、「hello」、または「hellhound」で始まる文字列と比較できます。マッチ。
/ar$/
上記の正規表現には「$」ロケーターが含まれているため、ターゲット オブジェクト内の「car」、「bar」、または「ar」で終わる文字列と一致します。

/bbom/
上記の正規表現パターンは「b」ロケーターで始まるため、ターゲット オブジェクトの「bomb」または「bom」で始まる文字列と一致します。
/manb/
上記の正規表現パターンは「b」ロケーターで終わるため、「human」、「women」、または「man」で終わるターゲット オブジェクト内の文字列と一致します。
ユーザーがより柔軟にマッチング パターンを設定できるようにするため、正規表現を使用すると、特定の文字に限定されず、マッチング パターン内の特定の範囲を指定できます。例:
/[A-Z]/
上記の正規表現は、A から Z までの任意の大文字と一致します。
/[a-z]/
上記の正規表現は、a から z までの範囲内の任意の小文字と一致します。
/[0-9]/
上記の正規表現は、0 から 9 までの任意の数値と一致します。
/([a-z][A-Z][0-9])+/
上記の正規表現は、「aB0」などの文字と数字で構成される任意の文字列と一致します。ここでユーザーが注意する必要があるのは、正規表現で「()」を使用して文字列を結合できることです。 「()」記号に含まれる内容は、ターゲット オブジェクトにも出現する必要があります。したがって、「abc」の最後の文字は数字ではなく文字であるため、上記の正規表現は「abc」などの文字列とは一致しません。
プログラミング ロジックの「OR」演算に似た正規表現を実装し、複数の異なるパターンのいずれかを選択して一致させる場合は、パイプ文字「|」を使用できます。例:
/to|too|2/
上記の正規表現は、ターゲット オブジェクトの "to"、"too"、または "2" に一致します。
正規表現でより一般的に使用される演算子として、否定演算子「[^]」もあります。先ほど紹介したロケーター「^」とは異なり、否定文字「[^]」は、パターンで指定された文字列が対象オブジェクト内に存在できないことを指定します。例:
/[^A-C]/
上記の文字列は、A、B、C を除くターゲット オブジェクト内の任意の文字と一致します。一般に、「[]」内に「^」がある場合は否定演算子とみなされ、「[]」の外側に「^」がある場合、または「[]」がない場合は否定演算子とみなされます。オペレーター。
最後に、ユーザーが正規表現パターンにメタキャラクターを追加して、一致するオブジェクトを見つける必要がある場合は、エスケープ文字「」を使用できます。例:
/Th*/
上記の正規表現は、ターゲット オブジェクトの "The" ではなく "Th*" と一致します。

3. 使用例

① PHP の ereg() 関数を使用して、パターン マッチング操作を実行できます。 ereg() 関数の使用形式は次のとおりです。


以下は引用内容です。
ereg(pattern, string)
ここで、pattern は通常のパターンを表します。式、文字列は検索と置換操作を実行するターゲット オブジェクトです。メールアドレスの確認も同様です。 PHP で記述したプログラムコードは次のとおりです。

< ?php
+@([a -zA-Z0-9_-])+(.[a-zA-Z0-9_-])+",$email)){
echo 「あなたのメールアドレスは正しいです!」;}
else{
echo 「もう一度お試しください!」; test() メソッドは、ターゲット オブジェクトに一致するパターンが含まれているかどうかを確認し、それに応じて true または false を返すことができます。
JavaScript を使用して次のスクリプトを作成し、ユーザーが入力した電子メール アドレスの有効性を確認できます。


以下は引用された内容です:


!-- 隠蔽開始
function verifyAddress(obj)
{
var email = obj.email.value;var パターン = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/; > flag = pattern.test(email);
if(flag)
alert("あなたのメールアドレスは正しいです!")
else
int
< ;/head>
;

>


正規表現に関して頭が痛いです。現在は自分の知識とインターネットの記事を活用し、一般の人にも理解できる表現を心がけています。ぜひ、あなたの学習体験をみんなと共有してください。
最初に ^ と $ について説明する必要があります。これらはそれぞれ文字列の先頭と末尾を一致させるために使用されます。

"^The": が必要です。先頭に「The」という文字列 ;
"of death$": 最後に "of Peace" を含む文字列が必要です;

その後、
"^abc$": abc で始まり abc 文字で終わる必要があります。実際には abc のみが一致します。
"notice": Notice を含む文字列と一致します。先ほど述べたように (最後の例)、パターン (正規表現) はテスト対象の文字列のどこにでも現れる可能性があり、どちらの側にもロックすることはできません。

次に、'*' '+' と '?' について説明します。
これらは、文字が出現する数または順序を示すために使用されます。
「ゼロまたは」を意味します。 「more」は {0,}
と同等です。「1 つ以上」は {1,}
と同等です。「0 または 1 つ」は {0,1}

と同等です。以下にいくつかあります。例:

"ab*": ab{0,} と同義で、a で始まり、その後に 0 または N b が続く文字列 ("a", "ab", "abbb", etc.);
"ab+": ab{1,} と同義、上記と同じですが、少なくとも 1 つの b が存在する必要があります ("ab" "abbb" など);
"ab? ": ab{0,1 }と同義。b は存在しないか、1 つだけ存在する可能性があります。
"a?b+$": 1 つまたは 0 a と 1 つ以上の b で終わる文字列と一致します。

重要なポイント: 「*」「+」および「?」はその前の文字のみを考慮します。

中括弧内に表示される文字数を制限することもできます。例:

"ab{2}": a の後には 2 つの b (それ以上) が続く必要があります。 ("abb");
"ab{2,}": a の後には 2 つ以上の b が必要です ("abb" "abbbb" など)。 3,5" }": a の後には 2 ~ 5 個の b ("abbb"、"abbbb"、または "abbbbb") が必要です。

次に、特定の文字を括弧で囲みます。例:

"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 が続きます。

ドット ('.') は、「n」を除くすべての単一文字を表すことができます

「n」を含むすべての単一文字と一致させたい場合はどうすればよいですか?

「[n.]」パターンを使用します。

「a.[0-9]」: a と文字と 0 から 9 までの数字;
「^.{3}$」: 3 つの任意の文字で終わります。

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

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

通常は [a -zA- Z] を使用して英語の大文字と小文字を指定します。

“^[a-zA-Z]”: 大文字と小文字で始まる文字列と一致します。
“[0-9] %”: x% の形式を含む文字列と一致します。
",[a-zA-Z0-9]$": カンマと数字または文字で終わる文字列と一致します。

という文字をリストすることもできます。角括弧で囲む必要はありません。「%[^a-zA-Z]%」は 2 つのパーセント記号 (そのうち 1 つはアルファベット以外の文字列) に一致します。

ポイント: 角括弧の先頭に ^ を使用すると、角括弧内の文字を除外することを意味します。

PHP がこれを解釈するには、これらの文字の前後に "" を追加し、一部の文字をエスケープする必要があります。括弧内の文字はこの規則の例外であることを忘れないでください。括弧内では、(") を含むすべての特殊文字はその特別なプロパティを失います。「[*+?{}.]」は、次の文字列を含む文字と一致します。

また、regx マニュアルには次のように書かれています。「リストに ']' が含まれる場合、それをリストの最初の文字 (おそらく '^' に続く) として使用するのが最善です。 「-」が含まれる場合は、先頭または最後に配置するか、範囲 [a-d-0-9] の 2 番目の終点の中央にある「-」が有効です。

上記の例を読めば、{n, m} が理解できるはずです。 n も m も負の整数にすることはできず、n は常に m より小さいことに注意してください。このようにして、少なくとも n 回、最大で m 回照合できます。たとえば、「p{1,5}」は「pvpppppp」の最初の 5 つの p

に一致します。

b で始まる単語について話しましょう。たとえば、「veb」は ve in love には一致しますが、ve

B には一致しません。これは、上記の b の正反対です。例は示しません

… 突然思い出しました…

で始まる他の構文を確認するには、http://www.phpv.net/article.php/251 にアクセスしてください。アプリケーションを実行してみましょう。通貨金額の入力に一致するパターンを構築する方法です。

入力情報がお金を表す数字であるかどうかを確認するために一致するパターンを構築します。金額を表すには「10000.00」と「10,000.00」、小数点を省略した「10000」と「10,000」の4通りがあると思います。次に、この一致パターンの構築を開始しましょう:

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

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

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

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

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

これは、0 または 0 で始まる数値です。数字で始まり、その前にマイナス記号が付く場合があります。さて、ここではあまり厳密にして 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 として扱うと、それを介して数学的な計算を行うことができます。

もう 1 つ:

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

完全なメール アドレスには 3 つの部分があります:

1. '@' の左側)
2.'@'
3. サーバー名 (残りの部分です)

ユーザー名には大文字、小文字、アラビア数字、ピリオド (' . ') マイナス記号 ('-') とアンダースコア '_')。サーバー名も、アンダースコアを除いて、このルールに従います。

現在、ユーザー名はピリオドで開始および終了することはできません。同様のことがサーバーにも当てはまります。また、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() の 1 つの機能により、ユーザーは正規表現を使用して文字列の一部を抽出できます (具体的な使用法についてはマニュアルを参照してください)。たとえば、パス/URL からファイル名を抽出したい場合、次のコードが必要です:

ereg(”([^\/]*)$”, $pathOrUrl, $regs);
echo $regs[1];

高度な置換

ereg_replace() と eregi_replace() も、区切られたすべての負符号をカンマで置き換えたい場合に非常に役立ちます。 >
ereg_replace("[ nrt]+", ",",trim($str));

最後に、記事を読むために EMAIL をチェックするための正規表現の別の文字列を追加しました。 :

“^[-!#$%&'*+\./0-9=?A-Z^_`a-z{|}~]+'.'@'.'[-! %&'*+\/0-9=?A-Z^_`a-z{|}~]+.'.'[-!#$%&'*+\./0-9=?A-Z^_ `a-z {|}~]+$”

簡単に理解できれば、この記事の目的は達成できます。
http://www.kxdoer.com/pa.php?q=php&catid=0

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート