ホームページ  >  記事  >  バックエンド開発  >  PHPの正規表現を詳しく解説(コード例)

PHPの正規表現を詳しく解説(コード例)

易达
易达オリジナル
2020-05-29 21:32:102920ブラウズ

この記事の目的:

1. 正規表現の定義

2. 正規表現のいくつかの基本文法

(1) 正規表現の定義

正規表現は、文字列を操作するための論理式であり、特定の文字を正規の文字列に結合するものです。

例:

<?php
$p = &#39;/abc123/&#39;;
$str = "abc123bbbb";
if (preg_match($p, $str)) {
    echo &#39;该字符串符合这个规则&#39;;
}
?>

上記のコード '/abc123/' /abc123/ は正規表現です。このことから、/abc123/ は文字と数字で構成される文字列であることがわかりますが、これらの文字には /abc123/ などの独自の特別な意味があります。この正規表現のルールは、文字列が abc123 で始まることです。 . 任意の文字列がこのルールに一致する場合、それはこの式に一致します。

(2) 正規表現のいくつかの基本構文

1. 正規の一致パターンでは区切り文字とメタ文字が使用されます。区切り文字には、数字、バックスラッシュ、スペース以外の任意の文字を使用できます。スラッシュ (/)、ハッシュ記号 (#)、否定記号 (~) などの一般的な区切り文字

#例:

/hello world/ 式 Yes の意味:文字列は hello world

#^[0-9]$# で始まります。 式の意味: 0 ~ 9 の数字と一致します。
~hello~ 式の意味: 文字列には hello

## が含まれます。 # コードでテストしましょう

例 1

/hello world/ 式の意味: 文字列は hello world

で始まります。
<?php
$p = "/hello world/";
$str = "hello world,i am a student";
if (preg_match($p, $str)) {
    echo &#39;该字符串符合这个规则/hello world/<br/>&#39;;
}

?>

実行結果は次のとおりです:

この文字列はこのルールに準拠しています/hello world/

表示する文字列を変更します次は、次で始まらないでくださいhello world
<?php
$p = "/hello world/";
$str = "helloworld,i am a student";
if (preg_match($p, $str)) {
    echo &#39;该字符串符合这个规则/hello world/<br/>&#39;;
}

?>

実行結果は次のとおりです:

空白

例 2

,#^[0-9]$# 式の意味は次のとおりです: 数字 0 ~ 9 の一致

<?php
$p2 = "#^[0-9]$#";
$str2 = "3";
if (preg_match($p2, $str2)) {
    echo &#39;该字符串符合这个规则"#^[0-9]$#<br/>&#39;;
}
?>

実行結果は次のとおりです:

The 文字列このルールに準拠します。「#^[0-9]$


#コードを変更し、文字列を 9 より大きい数値に変更して、実行されるかどうかを確認してください。
<?php
$p2 = "#^[0-9]$#";
$str2 = "30";
if (preg_match($p2, $str2)) {
    echo &#39;该字符串符合这个规则"#^[0-9]$#<br/>&#39;;
}else{
    echo &#39;该字符串不符合这个规则"#^[0-9]$#<br/>&#39;;
}
?>

結果は次のようになります:

この文字列はこのルールに準拠していません"#^[0-9]$

例 3、

~hello~ 式の意味は次のとおりです。文字列には hello が含まれています。

具体的なコードは次のとおりです。

<?php
$p3 = "~hello~";
$str3 = "ahellobb";
if (preg_match($p3, $str3)) {
    echo &#39;该字符串符合这个规则:~hello~&#39;;
}else{
    echo &#39;该字符串不符合这个规则:~hello~&#39;;
}
?>

実行結果は次のとおりです。

文字列はこのルールに準拠しています: ~hello~

hello が含まれないようにテスト文字列を変更します

具体的なコードは次のとおりです:

<?php
$p3 = "~hello~";
$str3 = "hell o";
if (preg_match($p3, $str3)) {
    echo &#39;该字符串符合这个规则:~hello~&#39;;
}else{
    echo &#39;该字符串不符合这个规则:~hello~&#39;;
}
?>

実行結果は次のとおりです:

##この文字列はこのルールに準拠していません: ~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 &#39;该字符串符合这个规则:/https:\/\/www./&#39;;
}else{
    echo &#39;该字符串不符合这个规则:/https:\/\/www./&#39;;
}

実行結果は次のとおりです:

この文字列はこのルールに準拠しています: /https:\/\/www./

https://www. で始まらないように文字列を変更して、

<?php
$p = "/https:\/\/www./";
$str = "http://www.baidu.com";
if (preg_match($p, $str)) {
    echo &#39;该字符串符合这个规则:/https:\/\/www./&#39;;
}else{
    echo &#39;该字符串不符合这个规则:/https:\/\/www./&#39;;
}
を確認してください。実行結果は次のとおりです:

この文字列は準拠していませんこのルールを使用します: /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 &#39;该字符串符合这个规则:/https://www.baidu.com/a/b/index.html/&#39;;
}else{
    echo &#39;该字符串不符合这个规则:/https://www.baidu.com/a/b/index.html/&#39;;
}
実行結果は次のとおりです:

警告: 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 = &#39;/&#39;.preg_quote($p, &#39;/&#39;).&#39;/&#39;;
$str = "https://www.baidu.com/a/b/index.html";
if (preg_match($p, $str)) {
    echo &#39;该字符串符合这个规则:/https://www.baidu.com/a/b/index.html/&#39;;
}else{
    echo &#39;该字符串不符合这个规则:/https://www.baidu.com/a/b/index.html/&#39;;
}
?>

実行中のコードは次のとおりです。結果は次のようになります:


この文字列は次のルールに準拠しています:/https://www.baidu.com/a/b/index.html/

4. パターン修飾子は区切り文字の後に使用できます。パターン修飾子には、i、m、s などが含まれます。

要約:

1. i は意味です。サイズは無視できます。

2 と記述します。m は、複数行のマッチングを意味します。

#3。この修飾子が設定されている場合、パターン内のドット メタ文字 (.) は、改行文字を含むすべての文字に一致します。 。この設定を行わないと、改行文字は含まれません。

ケース 1、

練習目標: 1. このケースは無視できるという意味です

<?php
$p = "/ABc/i";
$str = "abc";
if (preg_match($p, $str)) {
    echo &#39;该字符串符合这个规则:/ABc/i&#39;;
}else{
    echo &#39;该字符串不符合这个规则:/ABc/i&#39;;
}
?>

実行結果は次のとおりです:

#文字列は次のルールに準拠しています:/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 &#39;该字符串符合这个规则:/chinese/m,匹配结果为:&#39;;
    print_r($math);
}else{
    echo &#39;该字符串不符合这个规则:/chinese/m&#39;;
}
?>

実行結果は次のとおりです:

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 &#39;该字符串符合这个规则:/chinese/m,匹配结果为:&#39;;
    print_r($math);
}else{
    echo &#39;该字符串不符合这个规则:/chinese/m&#39;;
}
?>

运行结果为:

该字符串符合这个规则:/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 &#39;该字符串符合这个规则,匹配结果为:&#39;;
    print_r($math);
}else{
    echo &#39;该字符串不符合这个规则&#39;;
}

?>

运行结果其实是一样的,结果为:

该字符串符合这个规则,匹配结果为: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 &#39;该字符串符合这个规则,匹配结果为:&#39;;
    print_r($math);
}else{
    echo &#39;该字符串不符合这个规则&#39;;
}
?>

运行结果如下:

该字符串符合这个规则,匹配结果为: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 &#39;该字符串符合这个规则,匹配结果为:&#39;;
    print_r($math);
}else{
    echo &#39;该字符串不符合这个规则&#39;;
}
?>

运行结果如下:

该字符串符合这个规则,匹配结果为:Array ( [0] => Array ( [0] => chinese g ) )

说明此刻只匹配到一个了,因为.不包含换行符,所以第一个chinese没有匹配到

总结:

本文主要讲解了

1、正则表达式的定义

2、正则表达式的几个基本语法

以上がPHPの正規表現を詳しく解説(コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。