PHP 初心者のための正規表現
1.区切り文字
区切り文字とは何ですか?
いわゆるデリミタとは境界を設定するもので、その境界内に内容を記述する必要があります
// これは正規表現における区切り文字であり、式は//
の途中に記述する必要があります。 /a-z/
2 .区切り文字とは何ですか?
区切り文字には | |、//、{}、!! などの文字、数字、バックスラッシュ以外の文字も使用できますが、特別な必要がない場合は、正規表現の区切り記号を使用する
3.正規表現の構築
標準の正規表現は、
(1).Delimiter
(2).Expression
(3)の3つの部分で構成されます。
区切り文字: 区切り文字は式をラップするために使用されます。一般的に使用される区切り文字「/」を除く任意の文字を使用できます。
式: 式はいくつかの特殊文字 (メタ文字) と非文字で構成されます。特殊文字 (テキスト文字) は
修飾子で構成されます: PHP 正規表現の修飾子は正規表現の多くの特性を変更し、正規表現をニーズにより適したものにすることができます (注: 修飾記号では大文字と小文字が区別されます。つまり、 「e」は「E」と等しくありません)
正規表現の修飾子とは何ですか? PHP正規表現修飾子の種類と紹介:
◆i: 「i」を修飾子に追加すると、正規表現は大文字と小文字の区別をキャンセルします。つまり、「a」と「A」は同じです。
◆m: デフォルトの通常の開始 "^" と終了 "$" は通常の文字列のみに使用されます。修飾子に "m" を追加すると、開始と終了は文字列の各行、つまり先頭を参照します。各行は「^」で終わり「$」で終わります。
◆s: 修飾子に「s」を追加すると、改行文字を除く任意の文字を表すデフォルトの「.」が改行文字を含む任意の文字になります。
◆x: この修飾子を追加すると、エスケープされていない限り、式内の空白文字は無視されます。
◆e: この修飾子は置換の場合にのみ役立ちます。つまり、置換の PHP コードとして使用されます。
◆A: この修飾子を使用する場合、式は一致する文字列の先頭である必要があります。たとえば、「/a/A」は「abcd」と一致します。
◆E: "m" とは異なり、この修飾子が使用される場合、"$" は改行文字の前ではなく、文字列の絶対的な末尾と一致します。このモードはデフォルトでオンになっています。
◆U: クエスチョンマークと同じ機能があり、「貪欲モード」を設定するために使用されます。
正規表現のアトムアトムは正規表現の最小単位であり、端的に言えば、アトムは一致する必要があるコンテンツです。有効な正規表現には少なくとも 1 つのアトムが含まれている必要があります
説明: 私たちが目にするスペース、キャリッジ リターン、ライン フィード、0 ~ 9、A-Za-z、中国語、句読点、特殊記号はすべてアトムです。アトミックな例を行う前に、まず関数 preg_match について説明しましょう
構文: int preg_match (string $normal, string $string [, array &$result])
上記は、preg_match で一般的に使用される主なパラメーターです。他のいくつかのパラメーターは上にリストしませんでした。他の 2 つのパラメーターがあまりにも一般的でないためです。
実験を通して証明してみましょう:
<?php header("Content-type: text/html; charset=utf-8");//设置编码 $zz = '/a/'; $string = 'ddfdjjvai2jfvkwkfi24'; if(preg_match($zz, $string, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>
注: $zz は正規表現の規則です。 $string は文字列です。 この例は、文字列が一致する正規表現を満たすかどうかを判断するもので、満たす場合は結果を出力します。満足、出力情報
特別に識別された原子
d 0-9 と一致
<?php header("Content-type: text/html; charset=utf-8");//设置编码 // \d的用法 $zz = '/\d/'; $string = '我爱喝9你爱不爱喝'; if(preg_match($zz, $string, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>
D 0-9 を除くすべての文字
わぁ-zA- Z0-9_
<?php // \D 匹配出0-9以外的所有字符 $zz = '/\D/'; $string = '12124323453453'; if(preg_match($zz, $string, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>W wの反対
<?php // \w 匹配a-zA-Z0-9 还有下划线 $zz = '/\w/'; $string = '新中_国万岁呀万岁'; if(preg_match($zz, $string, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>s すべての空白文字と一致します
<?php //\W 除a-zA-Z0-9_ 以外的所有字符 $zz = '/\W/'; $string = '......'; if(preg_match($zz, $string, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>S 空でない文字
<?php // \s 匹配所有的空白字符 $zz = '/\s/'; $string = "中国万 岁"; if(preg_match($zz, $string, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>[ ]指定範囲アトム
<?php // \S 匹配非空字符 $zz = '/\S/'; $string = " a "; if(preg_match($zz, $string, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>これらの w s W S を覚えるのは難しいので、以下に同等のものがあります。効果は s w などと同じです。
+ 前の文字と少なくとも 1 回一致します
<?php // [] 指定原子范围 $zz = '/[0-5]\w+/'; $string = '6a'; $string1 = '1C'; if(preg_match($zz, $string, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>* 前の文字と 0 回または任意の回数一致します
<?php header("Content-type: text/html; charset=utf-8");//设置编码 $zz = '/\d+/'; $string = "迪奥和奥迪250都是我最爱"; //待会儿再试试中间没有0-9的情况 //$string = "迪奥和奥迪都是我最爱"; if(preg_match($zz, $string, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>は、0 回または 1 回出現します (オプション)
<?php $zz = '/\w*/'; $string = "!@!@!!@#@!$@#!"; //待会儿再试试中间没有0-9的情况 //$string1 = "!@#!@#!abcABC#@#!"; if(preg_match($zz, $string, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>を除くすべての文字と一致します。 n
<?php $zz = '/ABC\d?ABC/'; $string = "ABC1ABC"; //待会儿再试试中间没有0-9的情况 //$string1 = "ABC888888ABC"; //$string2 = "ABCABC"; if(preg_match($zz, $string, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>| (垂直バー)、または、最も低い優先順位
<?php $zz = '/gg.+gg/'; $string = "ABC1ABC"; if(preg_match($zz, $string, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>上記の例から、次のことがわかります。
1. マッチングの最初のアイデアは、abcd または abbcd に一致することでした。ただし、$string1 と $string2 を照合すると、照合結果は abc と bcd になります。2 を実装または照合すると、照合結果は abc または bcd になります。連続する文字列よりも優先度が高いわけではありません🎜
^ (サーカムフレックス)、^
<?php $zz = '/abc|bcd/'; $string1 = "abccd"; $string2 = "ggggbcd"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
の後の文字列で始まる必要があります。実験により次の結論が見つかりました:
1 は正常に一致しましたが、$string2 は正常に一致しませんでした
2。指定された文字
3 で始まり、$string2 は ^
4 以降の文字で始まりません。この規則の変換は、「Li Wenkai はとてもハンサムです」で始まり、その後に a-zA-Z0- が続きます。 9_少なくとも 1 文字。
$ (ドル記号) は $ の前の文字で終わる必要があります
<?php $zz = '/^张杰好帅\w+/'; $string1 = "张杰好帅abccdaaaasds"; //$string2没有以张杰好帅开始 $string2 = "帅abccdaaaasds"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
注:
$string1 は正常に一致しますが、$string2 は一致しません
$$ の前の文字は d+ で、その後に中国語の努力が続きます。
したがって、一致するのはこの全体です。 d は 0 ~ 9 の整数型を指し、+ 記号は少なくとも 1 つの 0 ~ 9
{m} を表します。これらは m 回のみ出現できます
<?php $zz = '/\d+努力$/'; $string1 = "12321124333努力"; //$string2 $string2 = "12311124112313力"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
注: d{1,3}上の例では、0 ~ 9 は 1 回、2 回または 3 回のみ出現できると規定しました。それ以外の時間はすべて間違っています
{m,} 少なくとも m 回、最大数は制限されていません
<?php $zz = '/喝\d{1,3}酒/'; $string1 = "喝9酒"; //$string2 = "喝988酒"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
上の例では、d{2,} を飲むと規定しています次の 0 ~ 9 少なくとも 2 回出現する必要があり、最大回数に制限はありません。したがって、$string1 は一致に失敗し、$string2 は正常に一致します。 $string3 は一致に成功しました
正規表現のヒント
少し書いて少しテストしてください
定数の正規化が必要であり、一致が成功するかどうかを比較するために preg_match を使用するためです。成功したら次のポイントを書きましょう。書き終えてすべてのマッチングが成功するまで!
次に、電子メールの正規表現の統合例を作成しましょう
ステップ 1: すべての電子メール形式をリストします
liwenkai@phpxy.com
iwenkai@corp.baidu.cm
iwenkai@126。 _w_k@xxx.com
2345@qq.com
最初に @ の前の文字 w+ と一致します (0-9A-Za-z_ であるため)
2 番目の文字の後に @ 記号が続きます
3 番目の文字は次にqq や 126 などの主要なドメイン名は
corp.baidu または 126 で下線を引くことができないため、[a-zA-Z0-9-]+ と書きます。通常、メールのサフィックスは次のようになります。したがって、次のように書くことができます: ([a-zA-Z0-9-]+.){1,2}
上記は、独自の意味を持つようにエスケープするものです。括弧は少なくとも 1 回、最大 2 回繰り返す必要があります。
com|cn|org|gov.cn|net|edu.cn を選択してお待ちください
<?php $zz = '/喝\d{2,}/'; $string1 = "喝9"; //$string2 = "喝98"; //$string3 = "喝98122121"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>