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 は文字列です。 この例は、文字列が一致する正規表現を満たすかどうかを判断するもので、満たす場合は結果を出力します。満足、出力情報

特別に識別された原子

图片1.png

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 などと同じです。

图片2.png

+ 前の文字と少なくとも 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 '没有匹配到';
	}
?>

学び続ける
||
<?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 '没有匹配到'; } ?>
  • おすすめコース
  • コースウェアのダウンロード
現時点ではコースウェアはダウンロードできません。現在スタッフが整理中です。今後もこのコースにもっと注目してください〜