ホームページ  >  記事  >  バックエンド開発  >  PHPの正規表現を詳しく学ぶ_PHPチュートリアル

PHPの正規表現を詳しく学ぶ_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-14 10:07:10782ブラウズ

1. はじめに

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

2. 基本的な文法

正規表現の機能と効果を予備的に理解した後、正規表現の構文形式を詳しく見てみましょう。
正規表現の形式は一般に次のとおりです:
/愛/
「/」区切り文字間の部分は、ターゲット オブジェクト内で照合されるパターンです。ユーザーは、一致するオブジェクトを検索するパターンのコンテンツを「/」区切り文字の間に入れるだけで済みます。ユーザーがパターンの内容をより柔軟にカスタマイズできるようにするために、正規表現は特別な「メタキャラクター」を提供します。いわゆるメタキャラクタは、正規表現において特別な意味を持つ特殊文字を指します。これを使用して、ターゲット オブジェクト内で先頭の文字 (つまり、メタキャラクタの前にある文字) の出現パターンを指定できます。
より一般的に使用されるメタ文字には、「+」、「*」、および「?」があります。このうち、「+」メタキャラクタは、その先頭文字が対象オブジェクト内で 1 回以上出現する必要があることを規定し、「*」メタキャラクタは、その先頭文字が対象オブジェクト内で 0 回または連続して複数回出現する必要があることを規定します。 「?」文字は、その前のオブジェクトがターゲット オブジェクト内に 0 回または 1 回出現する必要があることを指定します。
次に、正規表現メタキャラクターの具体的な用途を見てみましょう。
/fo+/
上記の正規表現には「+」メタ文字が含まれているため、ターゲット オブジェクト内の「fool」、「fo」、「football」など、文字 f の後に 1 つ以上の文字 o が連続して出現する文字列と一致できることを意味します。 。
/例*/
上記の正規表現にはメタキャラクター「*」が含まれているため、対象オブジェクト内の「easy」、「ego」、「egg」など、後ろに 0 個以上の文字 g が連続して出現する文字列と比較できることを意味します。 eの文字が一致します。
/ウィル?/
上記の正規表現には「?」メタ文字が含まれているため、ターゲット オブジェクトの「Win」または「Wilson」、および文字 i の後に 0 個または 1 個の文字 l が連続して出現するその他の文字列と一致できることを意味します。
メタキャラクターに加えて、ユーザーは一致したオブジェクトにパターンが出現する頻度を正確に指定できます。たとえば、
/ジム{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」、「hello」、または「hellhound」で始まる文字列と一致します。
/ar$/
上記の正規表現には「$」ロケーターが含まれているため、ターゲット オブジェクト内の「car」、「bar」、または「ar」で終わる文字列と一致します。

/ボム/
上記の正規表現パターンは「b」ロケーターで始まるため、ターゲット オブジェクト内の「bomb」または「bom」で始まる文字列と一致します。
/マンブ/
上記の正規表現パターンは「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」演算に似た正規表現を実装し、複数の異なるパターンのいずれかを選択して一致させる場合は、パイプ文字「|」を使用できます。例:
/へ|も|2/
上記の正規表現は、ターゲット オブジェクトの "to"、"too"、または "2" に一致します。
正規表現でより一般的に使用される演算子として、否定演算子「[^]」もあります。先ほど紹介したロケーター「^」とは異なり、否定文字「[^]」は、パターンで指定された文字列が対象オブジェクト内に存在できないことを指定します。例:
/[^A-C]/
上記の文字列は、A、B、C を除くターゲット オブジェクト内の任意の文字と一致します。一般に、「^」が「[]」の中にある場合は負の演算子とみなされ、「^」が「[]」の外にある場合、または「[]」がない場合は負の演算子とみなされます。オペレーター。
最後に、ユーザーが正規表現パターンにメタキャラクターを追加して、一致するオブジェクトを見つける必要がある場合は、エスケープ文字「」を使用できます。例:
/こ*/
上記の正規表現は、対象オブジェクト内の「The」などではなく「Th*」と一致します。

3.使用例

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

以下、引用内容です
ereg(パターン, 文字列)
このうち、patternは正規表現のパターンを表し、stringは検索・置換操作を行う対象のオブジェクトです。メールアドレスの認証も同様です。PHPで書かれたプログラムコードは以下の通りです。

if (ereg(“^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+”,$メール)){
echo 「あなたのメールアドレスは正しいです!」;}
他{
echo 「もう一度試してください!」;
}
?>


②JavaScript 1.2 には、正規表現のマッチング操作を実行するために使用できる強力な RegExp() オブジェクトが付属しています。 test() メソッドは、ターゲット オブジェクトに一致するパターンが含まれているかどうかを確認し、それに応じて true または false を返すことができます。
JavaScript を使用して次のスクリプトを作成し、ユーザーが入力した電子メール アドレスの有効性を確認できます。

以下、引用内容です

<頭>
<スクリプト言語="Javascript1.2">




<フォーム onSubmit="return verifyAddress(this);">





正規表現に頭を悩ませている人も多いのではないでしょうか。今日は私の理解とネット上の記事を参考に、一般の人にも理解できる表現を心がけています。ぜひ、あなたの学習体験をみんなと共有してください。
最初に ^ と $ について説明する必要があります。これらはそれぞれ文字列の先頭と末尾を一致させるために使用されます:

"^The": 先頭に "The" の文字列が必要です。 "of絶望$": 末尾に「絶望」を含む文字列が必要です
;

それで、

"^abc$": abc で始まり abc で終わる文字列が必要です。実際には、abc のみが一致します。 "notice": Notice を含む文字列と一致します。
前述した 2 つの文字 (最後の例) を使用しない場合、チェック対象の文字列のどこにでもパターン (正規表現) を出現させることができ、両側にロックしていないことがわかります。

次は「*」「+」「?」についてお話しましょう

これらは、文字が出現する数または順序を表すために使用されます:

「0 個以上」は {0,}

と同等です 「1 つ以上」は {1,} と同等です
「0 または 1」は {0,1}
に相当します。
ここにいくつかの例があります:

"ab*": ab{0,} と同義。マッチングは a で始まり、その後に 0 または N b で構成される文字列が続く場合があります ("a"、"ab"、"abbb" など)。 "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 (1 つ未満ではない) が続く必要があります ("abb")。 "ab{2,}": a の後には 2 つ以上の b が必要です ("abb" "abbbb" など)。 "ab{3,5}": a の後には 2 ~ 5 個の b ("abbb"、"abbbb"、または "abbbbb") が必要です。

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

"a(bc)*": a の後に 0 または 1 つの "bc" が続くものと一致します。 「a(bc){1,5}」: 1 ~ 5 「bc」;


OR 演算に相当する文字「|」もあります。

"hi|hello": "hi" または "hello" を含む文字列と一致します。 「(b|cd)ef」: 「bef」または「cdef」を含む文字列と一致します。 "(a|b)*c": 複数の (0 を含む) a または b の後に

が続く文字列と一致します。

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


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

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

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

角かっこで囲まれた内容は 1 文字のみと一致します

"[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 つのパーセント記号に一致します。 -アルファベットの文字列。

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

PHP がそれを解釈するには、これらの文字の前後に「」を追加し、一部の文字をエスケープする必要があります。

角括弧内の文字はこのルールの例外であることを忘れないでください。角括弧内では、(") を含むすべての特殊文字はその特別なプロパティを失います。「[*+?{}.]」は、次の文字列を含む文字と一致します。これらの文字:

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

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

で始まる言葉について話しましょう

b この本には、これは単語の境界を一致させるために使用されると記載されています。つまり...たとえば「veb」ですが、love の ve には一致しますが、very の 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]+)?$

これは、一致する文字列が少なくともアラビア数字で始まらなければならないことを意味します。ただし、上記のパターンでは「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-]+)*$

これは完全なメール認証照合モードです。次のように呼び出すだけです:

エレギ(”^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)* $”、$eamil)

メールかどうかを取得できます

正規表現のその他の使用法

文字列の抽出

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

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

高度な置換

ereg_replace() と eregi_replace() も、区切られたすべての負符号をカンマで置き換えたい場合に非常に便利です。

ereg_replace("[ nrt]+", ",", トリム($str));

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

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

それが簡単に理解できれば、この記事の目的は達成されます。

www.bkjia.com本当http://www.bkjia.com/PHPjc/477895.html技術記事 1. はじめに 簡単に言えば、正規表現はパターンの一致と置換に使用できる強力なツールです。 UNIX システムをベースにしたほぼすべてのツールで正規表現を見つけることができます...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。