PHP 初心者のための正規(guī)表現(xiàn)
1.區(qū)切り文字
區(qū)切り文字とは何ですか?
いわゆるデリミタとは境界を設(shè)定するもので、その境界內(nèi)に內(nèi)容を記述する必要があります
// これは正規(guī)表現(xiàn)における?yún)^(qū)切り文字であり、式は//
の途中に記述する必要があります。 /a-z/
2 .區(qū)切り文字とは何ですか?
區(qū)切り文字には | |、//、{}、!! などの文字、數(shù)字、バックスラッシュ以外の文字も使用できますが、特別な必要がない場合は、正規(guī)表現(xiàn)の區(qū)切り記號を使用する
3.正規(guī)表現(xiàn)の構(gòu)築
標(biāo)準(zhǔn)の正規(guī)表現(xiàn)は、
(1).Delimiter
(2).Expression
(3)の3つの部分で構(gòu)成されます。
區(qū)切り文字: 區(qū)切り文字は式をラップするために使用されます。一般的に使用される?yún)^(qū)切り文字「/」を除く任意の文字を使用できます。
式: 式はいくつかの特殊文字 (メタ文字) と非文字で構(gòu)成されます。特殊文字 (テキスト文字) は
修飾子で構(gòu)成されます: PHP 正規(guī)表現(xiàn)の修飾子は正規(guī)表現(xiàn)の多くの特性を変更し、正規(guī)表現(xiàn)をニーズにより適したものにすることができます (注: 修飾記號では大文字と小文字が區(qū)別されます。つまり、 「e」は「E」と等しくありません)
正規(guī)表現(xiàn)の修飾子とは何ですか? PHP正規(guī)表現(xiàn)修飾子の種類と紹介:
◆i: 「i」を修飾子に追加すると、正規(guī)表現(xiàn)は大文字と小文字の區(qū)別をキャンセルします。つまり、「a」と「A」は同じです。
◆m: デフォルトの通常の開始 "^" と終了 "$" は通常の文字列のみに使用されます。修飾子に "m" を追加すると、開始と終了は文字列の各行、つまり先頭を參照します。各行は「^」で終わり「$」で終わります。
◆s: 修飾子に「s」を追加すると、改行文字を除く任意の文字を表すデフォルトの「.」が改行文字を含む任意の文字になります。
◆x: この修飾子を追加すると、エスケープされていない限り、式內(nèi)の空白文字は無視されます。
◆e: この修飾子は置換の場合にのみ役立ちます。つまり、置換の PHP コードとして使用されます。
◆A: この修飾子を使用する場合、式は一致する文字列の先頭である必要があります。たとえば、「/a/A」は「abcd」と一致します。
◆E: "m" とは異なり、この修飾子が使用される場合、"$" は改行文字の前ではなく、文字列の絶対的な末尾と一致します。このモードはデフォルトでオンになっています。
◆U: クエスチョンマークと同じ機(jī)能があり、「貪欲モード」を設(shè)定するために使用されます。
正規(guī)表現(xiàn)のアトムアトムは正規(guī)表現(xiàn)の最小単位であり、端的に言えば、アトムは一致する必要があるコンテンツです。有効な正規(guī)表現(xiàn)には少なくとも 1 つのアトムが含まれている必要があります
説明: 私たちが目にするスペース、キャリッジ リターン、ライン フィード、0 ~ 9、A-Za-z、中國語、句読點(diǎn)、特殊記號はすべてアトムです。アトミックな例を行う前に、まず関數(shù) preg_match について説明しましょう
構(gòu)文: int preg_match (string $normal, string $string [, array &$result])
上記は、preg_match で一般的に使用される主なパラメーターです。他のいくつかのパラメーターは上にリストしませんでした。他の 2 つのパラメーターがあまりにも一般的でないためです。
実験を通して証明してみましょう:
<?php header("Content-type: text/html; charset=utf-8");//設(shè)置編碼 $zz = '/a/'; $string = 'ddfdjjvai2jfvkwkfi24'; if(preg_match($zz, $string, $matches)){ echo '匹配到了,結(jié)果為:'; var_dump($matches); }else{ echo '沒有匹配到'; } ?>
注: $zz は正規(guī)表現(xiàn)の規(guī)則です。 $string は文字列です。 この例は、文字列が一致する正規(guī)表現(xiàn)を満たすかどうかを判斷するもので、満たす場合は結(jié)果を出力します。満足、出力情報(bào)
特別に識別された原子
d 0-9 と一致
<?php header("Content-type: text/html; charset=utf-8");//設(shè)置編碼 // \d的用法 $zz = '/\d/'; $string = '我愛喝9你愛不愛喝'; if(preg_match($zz, $string, $matches)){ echo '匹配到了,結(jié)果為:'; 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 '匹配到了,結(jié)果為:'; var_dump($matches); }else{ echo '沒有匹配到'; } ?>W wの反対
<?php // \w 匹配a-zA-Z0-9 還有下劃線 $zz = '/\w/'; $string = '新中_國萬歲呀萬歲'; if(preg_match($zz, $string, $matches)){ echo '匹配到了,結(jié)果為:'; var_dump($matches); }else{ echo '沒有匹配到'; } ?>s すべての空白文字と一致します
<?php //\W 除a-zA-Z0-9_ 以外的所有字符 $zz = '/\W/'; $string = '......'; if(preg_match($zz, $string, $matches)){ echo '匹配到了,結(jié)果為:'; var_dump($matches); }else{ echo '沒有匹配到'; } ?>S 空でない文字
<?php // \s 匹配所有的空白字符 $zz = '/\s/'; $string = "中國萬 歲"; if(preg_match($zz, $string, $matches)){ echo '匹配到了,結(jié)果為:'; var_dump($matches); }else{ echo '沒有匹配到'; } ?>[ ]指定範(fàn)囲アトム
<?php // \S 匹配非空字符 $zz = '/\S/'; $string = " a "; if(preg_match($zz, $string, $matches)){ echo '匹配到了,結(jié)果為:'; 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 '匹配到了,結(jié)果為:'; var_dump($matches); }else{ echo '沒有匹配到'; } ?>* 前の文字と 0 回または任意の回?cái)?shù)一致します
<?php header("Content-type: text/html; charset=utf-8");//設(shè)置編碼 $zz = '/\d+/'; $string = "迪奧和奧迪250都是我最愛"; //待會(huì)兒再試試中間沒有0-9的情況 //$string = "迪奧和奧迪都是我最愛"; if(preg_match($zz, $string, $matches)){ echo '匹配到了,結(jié)果為:'; var_dump($matches); }else{ echo '沒有匹配到'; } ?>は、0 回または 1 回出現(xiàn)します (オプション)
<?php $zz = '/\w*/'; $string = "!@!@!!@#@!$@#!"; //待會(huì)兒再試試中間沒有0-9的情況 //$string1 = "!@#!@#!abcABC#@#!"; if(preg_match($zz, $string, $matches)){ echo '匹配到了,結(jié)果為:'; var_dump($matches); }else{ echo '沒有匹配到'; } ?>を除くすべての文字と一致します。 n
<?php $zz = '/ABC\d?ABC/'; $string = "ABC1ABC"; //待會(huì)兒再試試中間沒有0-9的情況 //$string1 = "ABC888888ABC"; //$string2 = "ABCABC"; if(preg_match($zz, $string, $matches)){ echo '匹配到了,結(jié)果為:'; var_dump($matches); }else{ echo '沒有匹配到'; } ?>| (垂直バー)、または、最も低い優(yōu)先順位
<?php $zz = '/gg.+gg/'; $string = "ABC1ABC"; if(preg_match($zz, $string, $matches)){ echo '匹配到了,結(jié)果為:'; var_dump($matches); }else{ echo '沒有匹配到'; } ?>上記の例から、次のことがわかります。
1. マッチングの最初のアイデアは、abcd または abbcd に一致することでした。ただし、$string1 と $string2 を照合すると、照合結(jié)果は abc と bcd になります。2 を?qū)g裝または照合すると、照合結(jié)果は abc または bcd になります。連続する文字列よりも優(yōu)先度が高いわけではありません??
^ (サーカムフレックス)、^
<?php $zz = '/abc|bcd/'; $string1 = "abccd"; $string2 = "ggggbcd"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,結(jié)果為:'; var_dump($matches); } else { echo '沒有匹配到'; } ?>
の後の文字列で始まる必要があります。実験により次の結(jié)論が見つかりました:
1 は正常に一致しましたが、$string2 は正常に一致しませんでした
2。指定された文字
3 で始まり、$string2 は ^
4 以降の文字で始まりません。この規(guī)則の変換は、「Li Wenkai はとてもハンサムです」で始まり、その後に a-zA-Z0- が続きます。 9_少なくとも 1 文字。
$ (ドル記號) は $ の前の文字で終わる必要があります
<?php $zz = '/^張杰好帥\w+/'; $string1 = "張杰好帥abccdaaaasds"; //$string2沒有以張杰好帥開始 $string2 = "帥abccdaaaasds"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,結(jié)果為:'; var_dump($matches); } else { echo '沒有匹配到'; } ?>
注:
$string1 は正常に一致しますが、$string2 は一致しません
$$ の前の文字は d+ で、その後に中國語の努力が続きます。
したがって、一致するのはこの全體です。 d は 0 ~ 9 の整數(shù)型を指し、+ 記號は少なくとも 1 つの 0 ~ 9
{m} を表します。これらは m 回のみ出現(xiàn)できます
<?php $zz = '/\d+努力$/'; $string1 = "12321124333努力"; //$string2 $string2 = "12311124112313力"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,結(jié)果為:'; var_dump($matches); } else { echo '沒有匹配到'; } ?>
注: d{1,3}上の例では、0 ~ 9 は 1 回、2 回または 3 回のみ出現(xiàn)できると規(guī)定しました。それ以外の時(shí)間はすべて間違っています
{m,} 少なくとも m 回、最大數(shù)は制限されていません
<?php $zz = '/喝\d{1,3}酒/'; $string1 = "喝9酒"; //$string2 = "喝988酒"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,結(jié)果為:'; var_dump($matches); } else { echo '沒有匹配到'; } ?>
上の例では、d{2,} を飲むと規(guī)定しています次の 0 ~ 9 少なくとも 2 回出現(xiàn)する必要があり、最大回?cái)?shù)に制限はありません。したがって、$string1 は一致に失敗し、$string2 は正常に一致します。 $string3 は一致に成功しました
正規(guī)表現(xiàn)のヒント
少し書いて少しテストしてください
定數(shù)の正規(guī)化が必要であり、一致が成功するかどうかを比較するために preg_match を使用するためです。成功したら次のポイントを書きましょう。書き終えてすべてのマッチングが成功するまで!
次に、電子メールの正規(guī)表現(xiàn)の統(tǒng)合例を作成しましょう
ステップ 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}
上記は、獨(dú)自の意味を持つようにエスケープするものです。括弧は少なくとも 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 '匹配到了,結(jié)果為:'; var_dump($matches); } else { echo '沒有匹配到'; } ?>