ホームページ >バックエンド開発 >PHPチュートリアル >PHPの正規表現を詳しく解説(コード例)
1. 正規表現の定義
2. 正規表現のいくつかの基本文法
正規表現は、文字列を操作するための論理式であり、特定の文字を正規の文字列に結合するものです。
例:
<?php $p = '/abc123/'; $str = "abc123bbbb"; if (preg_match($p, $str)) { echo '该字符串符合这个规则'; } ?>
上記のコード '/abc123/' /abc123/ は正規表現です。このことから、/abc123/ は文字と数字で構成される文字列であることがわかりますが、これらの文字には /abc123/ などの独自の特別な意味があります。この正規表現のルールは、文字列が abc123 で始まることです。 . 任意の文字列がこのルールに一致する場合、それはこの式に一致します。
1. 正規の一致パターンでは区切り文字とメタ文字が使用されます。区切り文字には、数字、バックスラッシュ、スペース以外の任意の文字を使用できます。スラッシュ (/)、ハッシュ記号 (#)、否定記号 (~) などの一般的な区切り文字
#例: /hello world/ 式 Yes の意味:文字列は hello world#^[0-9]$# で始まります。 式の意味: 0 ~ 9 の数字と一致します。
~hello~ 式の意味: 文字列には hello
## が含まれます。 # コードでテストしましょう
、/hello world/ 式の意味: 文字列は hello world
で始まります。<?php $p = "/hello world/"; $str = "hello world,i am a student"; if (preg_match($p, $str)) { echo '该字符串符合这个规则/hello world/<br/>'; } ?>
実行結果は次のとおりです:
この文字列はこのルールに準拠しています/hello world/表示する文字列を変更します次は、次で始まらないでくださいhello world
<?php $p = "/hello world/"; $str = "helloworld,i am a student"; if (preg_match($p, $str)) { echo '该字符串符合这个规则/hello world/<br/>'; } ?>
実行結果は次のとおりです:
空白例 2
,#^[0-9]$# 式の意味は次のとおりです: 数字 0 ~ 9 の一致
<?php $p2 = "#^[0-9]$#"; $str2 = "3"; if (preg_match($p2, $str2)) { echo '该字符串符合这个规则"#^[0-9]$#<br/>'; } ?>
実行結果は次のとおりです:
The 文字列このルールに準拠します。「#^[0-9]$#コードを変更し、文字列を 9 より大きい数値に変更して、実行されるかどうかを確認してください。
<?php $p2 = "#^[0-9]$#"; $str2 = "30"; if (preg_match($p2, $str2)) { echo '该字符串符合这个规则"#^[0-9]$#<br/>'; }else{ echo '该字符串不符合这个规则"#^[0-9]$#<br/>'; } ?>
結果は次のようになります:
この文字列はこのルールに準拠していません"#^[0-9]$例 3、
~hello~ 式の意味は次のとおりです。文字列には hello が含まれています。
具体的なコードは次のとおりです。
<?php $p3 = "~hello~"; $str3 = "ahellobb"; if (preg_match($p3, $str3)) { echo '该字符串符合这个规则:~hello~'; }else{ echo '该字符串不符合这个规则:~hello~'; } ?>
hello が含まれないようにテスト文字列を変更します
具体的なコードは次のとおりです:
<?php $p3 = "~hello~"; $str3 = "hell o"; if (preg_match($p3, $str3)) { echo '该字符串符合这个规则:~hello~'; }else{ echo '该字符串不符合这个规则:~hello~'; } ?>
実行結果は次のとおりです:
##この文字列はこのルールに準拠していません: ~hello~
1、/ は先頭を意味します 2 、^ は ^ の後の文字で始まることを意味します 3、$ は $ 前の文字で終わることを意味します 4、~ は意味します次のことがわかります:
2 という意味を含みます。パターンに区切り文字が含まれている場合、区切り文字をバックスラッシュ (\) でエスケープする必要があります。
例:
/https:\/\/www./
は https://www.<?php $p = "/https:\/\/www./"; $str = "https://www.baidu.com"; if (preg_match($p, $str)) { echo '该字符串符合这个规则:/https:\/\/www./'; }else{ echo '该字符串不符合这个规则:/https:\/\/www./'; }実行結果は次のとおりです:
この文字列はこのルールに準拠しています: /https:\/\/www./
https://www. で始まらないように文字列を変更して、
<?php $p = "/https:\/\/www./"; $str = "http://www.baidu.com"; if (preg_match($p, $str)) { echo '该字符串符合这个规则:/https:\/\/www./'; }else{ echo '该字符串不符合这个规则:/https:\/\/www./'; }を確認してください。実行結果は次のとおりです:
この文字列は準拠していませんこのルールを使用します: /https:\/\/www./
3. パターンに多くの区切り文字が含まれている場合は、他の文字を区切り文字として使用することをお勧めします。 preg_quote を使用してエスケープできます。
例 1、
<?php $p = "/https://www.baidu.com/a/b/index.html/"; $str = "http://www.baidu.com/a/b/index.html"; if (preg_match($p, $str)) { echo '该字符串符合这个规则:/https://www.baidu.com/a/b/index.html/'; }else{ echo '该字符串不符合这个规则:/https://www.baidu.com/a/b/index.html/'; }実行結果は次のとおりです:
警告: preg_match(): 不明な修飾子 '/' D:\E-class\class-code\classing\index.php の 7 行目
この文字列はこのルールに準拠していません:/https://www.baidu.com/a/b/index.html /具体的なコードは次のとおりです:
したがって、現時点では直接書き込むことはできません/上記のようにエスケープするか、次のように続行してください
<?php $p = "https://www.baidu.com/a/b/index.html"; $p = '/'.preg_quote($p, '/').'/'; $str = "https://www.baidu.com/a/b/index.html"; if (preg_match($p, $str)) { echo '该字符串符合这个规则:/https://www.baidu.com/a/b/index.html/'; }else{ echo '该字符串不符合这个规则:/https://www.baidu.com/a/b/index.html/'; } ?>実行中のコードは次のとおりです。結果は次のようになります:
この文字列は次のルールに準拠しています:/https://www.baidu.com/a/b/index.html/
4. パターン修飾子は区切り文字の後に使用できます。パターン修飾子には、i、m、s などが含まれます。
要約:
1. i は意味です。サイズは無視できます。
#3。この修飾子が設定されている場合、パターン内のドット メタ文字 (.) は、改行文字を含むすべての文字に一致します。 。この設定を行わないと、改行文字は含まれません。
ケース 1、練習目標: 1. このケースは無視できるという意味です
<?php $p = "/ABc/i"; $str = "abc"; if (preg_match($p, $str)) { echo '该字符串符合这个规则:/ABc/i'; }else{ echo '该字符串不符合这个规则:/ABc/i'; } ?>
実行結果は次のとおりです:
#文字列は次のルールに準拠しています:/ABc/i
ケース 2、
練習目標:1. m は複数行の一致を意味します
具体的なコードは次のとおりです:
<?php $p = "/chinese/m"; $str = "i am a chinese people,\n you alose is a chinese people"; $math = ""; if (preg_match_all($p, $str,$math)) { echo '该字符串符合这个规则:/chinese/m,匹配结果为:'; print_r($math); }else{ echo '该字符串不符合这个规则:/chinese/m'; } ?>
実行結果は次のとおりです:
This文字列はこのルールに準拠しています: / chinese/m、一致する結果は次のとおりです: Array ( [0] => Array ( [0] => chinese [1] => chinese ) ) #ここで注意すべき点は、preg_match_all を使用することです。そうでない場合、preg_match は 1 行のみに一致します。接下来我们运行下效果
<?php $p = "/chinese/m"; $str = "i am a chinese people,\n you alose is a chinese people"; $math = ""; if (preg_match($p, $str,$math)) { echo '该字符串符合这个规则:/chinese/m,匹配结果为:'; print_r($math); }else{ echo '该字符串不符合这个规则:/chinese/m'; } ?>运行结果为:
该字符串符合这个规则:/chinese/m,匹配结果为:Array ( [0] => chinese )
其实/m在此也算多此一举,因为preg_match_all就是表示多行匹配了
<?php $p = "/chinese/"; $str = "i am a chinese people,\n you alose is a chinese people"; $math = ""; if (preg_match_all($p, $str,$math)) { echo '该字符串符合这个规则,匹配结果为:'; print_r($math); }else{ echo '该字符串不符合这个规则'; } ?>运行结果其实是一样的,结果为:
该字符串符合这个规则,匹配结果为:Array ( [0] => Array ( [0] => chinese [1] => chinese ) )
只是要知道m表示多行匹配的意思
案例三、
实践目标:
1、如果设定了此修正符,模式中的圆点元字符(.)匹配所有的字符,包括换行符。没有此设定的话,则不包括换行符。
具体代码如下:
<?php $p = "/chinese ./s"; $str = "i am a chinese \n people, you alose is a chinese good people"; $math = ""; if (preg_match_all($p, $str,$math)) { echo '该字符串符合这个规则,匹配结果为:'; print_r($math); }else{ echo '该字符串不符合这个规则'; } ?>运行结果如下:
该字符串符合这个规则,匹配结果为:Array ( [0] => Array ( [0] => chinese [1] => chinese g ) )
说明第一个chinese 后面的字符是换行也匹配到了,这说明了s的意思就是.要包含换行符,接下来
我们去掉s,看下最终的结果
<?php $p = "/chinese ./"; $str = "i am a chinese \n people, you alose is a chinese good people"; $math = ""; if (preg_match_all($p, $str,$math)) { echo '该字符串符合这个规则,匹配结果为:'; print_r($math); }else{ echo '该字符串不符合这个规则'; } ?>运行结果如下:
该字符串符合这个规则,匹配结果为:Array ( [0] => Array ( [0] => chinese g ) )
说明此刻只匹配到一个了,因为.不包含换行符,所以第一个chinese没有匹配到
总结:
本文主要讲解了
1、正则表达式的定义
2、正则表达式的几个基本语法
以上がPHPの正規表現を詳しく解説(コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。