1 はじめに
Web のバックグラウンド CGI 開発では、通常、ユーザーが入力したデータが間違っている場合に問題が発生します。 「!では、夏休みが正しいかどうかはどのように確認すればよいのでしょうか? 正規表現のサポートが PHP に追加され、データ照合を非常に便利に実行できるようになりました。
2 正規表現とは:
簡単に言えば、正規表現はパターンの一致と置換のための強力なツールです。正規表現の痕跡は、Perl や PHP スクリプト言語など、Unix/Linux システムに基づくほとんどすべてのソフトウェア ツールで見つかります。さらに、クライアント側のスクリプト言語 &106avascript も正規表現をサポートしています。現在、正規表現は一般的な概念およびツールとなり、さまざまな技術者によって広く使用されています。
Linux の Web サイトには次のような記述があります。「Linux 愛好家に何が最も好きかを尋ねれば、彼はおそらく正規表現と答えるでしょう。面倒なインストールと構成のほかに、何が最も怖いかを尋ねれば、彼は間違いなくこう答えるでしょう」正規表現「
」上で述べたように、正規表現は非常に複雑で怖く見えますが、ほとんどの PHP 初心者はここをスキップして以下の学習を続けるでしょう。ただし、PHP の正規表現では、文字列が条件を満たすかどうかを判断して、パターン マッチングを使用できます。または、指定した文字列を使用して修飾された文字列を置き換えたり、その他の強力な関数を学ばないのは残念です...
3 正規表現の基本構文:
正規表現は、区切り文字、式、修飾子の 3 つの部分に分かれています。
区切り文字には、特殊文字 (「/!」など) を除く任意の文字を使用できます。一般的に使用される区切り文字は「/」です。この式は、いくつかの特殊文字 (以下の特殊文字を参照) と特殊でない文字列で構成されます。たとえば、「[a-z0-9_-]+@[a-z0-9_-.]+」は、単純な電子メールに一致します。弦。修飾子は、特定の機能/モードをオンまたはオフにするために使用されます。完全な正規表現の例を次に示します:
/hello.+?こんにちは/です
上記の正規表現「/」は区切り文字、2 つの「/」の間にある正規表現は式、2 番目の「/」の後の文字列「is」は修飾子です。
式に区切り文字がある場合は、「/hello.+?/hello/is」のようにエスケープ記号「」を使用する必要があります。エスケープ記号は区切り文字として使用されるだけでなく、特殊文字も実行できます。文字で構成されるすべての特殊文字は、すべての数字を表す「d」などでエスケープする必要があります。
4 正規表現の特殊文字:
正規表現の特殊文字は、メタ文字、位置決め文字などに分類されます。
メタキャラクターは、正規表現において特別な意味を持つ文字の一種で、一致したオブジェクト内で先頭の文字 (つまり、メタキャラクターの前の文字) がどのように現れるかを記述するために使用されます。メタキャラクター自体は単一の文字ですが、異なるまたは同一のメタキャラクターを組み合わせて、より大きなメタキャラクターを形成することができます。
メタキャラクター:
中括弧: 中括弧は、一致するメタキャラクターの出現数を正確に指定するために使用されます。たとえば、「/pre{1,5}/」は、一致するオブジェクトが「pre」、「pree」、「preeeee」などであることを意味します。 「pr」の後に 1~5の文字列「e」が表示されます。または、「/pre{,5}/」は、pre が 0 回から 5 回まで出現することを意味します。
プラス記号: 「+」文字は、メタキャラクターが 1 回以上出現する前の文字と一致するために使用されます。たとえば、「/ac+/」は、一致するオブジェクトが、「a」の後に 1 つ以上の「c」が続く「act」、「account」、「acccc」などの文字列である可能性があることを意味します。 「+」は「{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:]: 任意の句読点と一致します
[: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 つの非常に重要なタイプの文字です。その主な機能は、一致するオブジェクト内の文字の位置を記述することです。
^: 一致するパターンが一致するオブジェクトの先頭に現れることを示します (「[]」とは異なります)
$: 一致するパターンが一致するオブジェクトの最後に現れることを示します
スペース: 一致したパターンが先頭と末尾の間の 2 つの境界のいずれかに表示されることを示します
"/^he/": hello、height など、"he" 文字で始まる文字列と一致します。
"/he$/": she など、「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」のように「a」の後に「b」が多数含まれている場合です。 bbbbbbbbbbbbbbbbbb" の場合、正規表現は最初の "b" と最後の "b" に一致しますか?貪欲モードを使用する場合は、最後の「b」が照合されます。それ以外の場合は、最初の「b」のみが照合されます。
貪欲モードを使用した式は次のようになります:
/a.+?b/
/a.+b/U
貪欲モードを使用しないものは次のとおりです:
/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(文字列パターン, 文字列件名, 配列 [一致]);
この関数は、文字列内のパターン式を使用して照合します。[regs] が指定された場合、文字列は [regs][0] に記録されます。これは、括弧「()」を使用して記録することを表します。最初の文字列 [regs][2] は、記録された 2 番目の文字列を表し、以下同様となります。 preg は、一致するパターンが文字列内で見つかった場合は "true" を返し、それ以外の場合は "false" を返します。
2.preg_replace:
関数形式:mixed preg_replace(混合パターン、混合置換、混合主題);
この関数は、式パターンに一致する string 内のすべての文字列を式置換で置き換えます。置換にパターンの一部の文字を含める必要がある場合は、「()」を使用してそれを記録できます。置換には「1」を使用するだけで済みます。
3.preg_split:
関数の形式: array preg_split(string pattern, string subject, int [limit]);
この関数は関数 split と同じですが、唯一の違いは、split は単純な正規表現を使用して一致する文字列を分割できるのに対し、preg_split は完全に Perl 互換の正規表現を使用することです。 3 番目のパラメーター制限は、返される修飾された値の数を表します。
4.preg_grep:
関数形式: array preg_grep(文字列パターン, 配列入力);
この関数は基本的に preg_match と同じですが、preg_grep は指定された配列入力内のすべての要素と一致し、新しい配列を返すことができます。
たとえば、電子メール アドレスの形式が正しいかどうかを確認する例を示します。
関数 emailIsRight($email) {
if (preg_match("^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,3}$",$メール)){
1 を返します;
}
0 を返す;
}
if(emailIsRight('y10k@963.net')) echo '正しい
';
if(!emailIsRight('y10k@fffff')) echo '不正解です
';
?>
上記のプログラムは「正しい
」と出力します。
間違っています。
8. Perl 互換の正規表現と PHP の Perl/Ereg 正規表現の違い:
これは「Perl 互換正規表現」と呼ばれていますが、Perl の正規表現と比較すると、PHP にはまだいくつかの違いがあります。たとえば、Perl の修飾子「G」はすべての一致を表しますが、PHP ではこの修飾子はサポートされていません。
ereg シリーズの関数との違いもあります。 ereg も PHP で提供されている正規表現関数ですが、preg に比べて非常に弱いです。
1. ereg ではデリミタと修飾子は必要なく、使用できないため、ereg の機能は preg よりもはるかに弱いです。
2. 「.」について: 正規表現のドットは通常、改行文字を除くすべての文字ですが、ereg の「.」は改行文字を含む任意の文字です。 「.」に改行文字を含めたい場合は、修飾子に「s」を追加します。
3. ereg はデフォルトで貪欲モードを使用するため、多くの置換やマッチングに問題を引き起こします。
4. 速度: これは多くの人が懸念している質問かもしれません。preg の強力な機能は速度と引き換えですか?心配しないでください、preg は ereg よりもはるかに高速です:
プログラムのテストを作成しました。
タイムテスト:
PHPコード:
echo "Preg_replace の使用時間:";
$start = time();
for($i=1;$i $str = "sssssssssssssssssssssssssss";
preg_replace("/s/","",$str);
}
$ended = time()-$start;
エコー $end;
エコー「
」ereg_replace 使用時間:";
$start = time();
for($i=1;$i
$str = "sssssssssssssssssssssssssss";
ereg_replace("s","",$str);
}
$ended = time()-$start;
エコー $end;
エコー「
」str_replace の使用時間:";
$start = time();
for($i=1;$i
$str = "sssssssssssssssssssssssssssss";
str_replace("s","",$str);
}
$ended = time()-$start;
エコー $end;
?>
結果:
Preg_replace使用時間:5
ereg_replace使用時間:15
str_replace使用時間:2
str_replace は照合を必要としないため非常に高速であり、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 など) がこの方法を使用しますが、特定のコードは比較的長くなっています。