PHP の高度な機能の 1 つ: 正規表現の使用
PHP で文字列処理を実行する場合、文字列処理関数を使用できる場合は、もちろん単純な文字列処理関数を使用する必要がありますが、文字列処理関数 能力には限界があるため、より強力なツールである正規表現を使用する必要があります。
正規表現は、文字列の配置パターンを記述するカスタム文法規則です。正規表現は、特定のルールを使用してパターンを構築し、入力文字列情報と比較して、セグメント化、一致、検索、置換などの関連操作を実行します。正規表現は PHP に固有のものではありません。ここでは、PHP での正規表現の使用方法を紹介します。
1. PHP では、文字列処理関数でタスクを完了できる場合は、正規表現を使用すべきではありません。
2. 形式チェックなど、正規表現を使用する必要がある複雑な操作がいくつかあります。
3. 正規表現も文字列ですが、特別な意味を持つ文字列です。
4. いくつかの記述ルールがあり、 プログラミング言語とみなすこともできます。
5. 正規表現は、特定の関数に適用する場合にのみ使用できます。それ以外の場合は、単純な文字列です。
画像マッチングの例
1
|
"/ |
1 |
<img src="a.jpg"/> |
1
|
<img src="a.jpg"/>
|
PHP の正規表現関数ライブラリPHP には、2 セットの正規表現関数ライブラリがあります。
1. POSIX 拡張正規表現関数 (ereg_)。Perl 互換の2.Perl互換の正規表現関数(preg_)。
1 |
"/ |
1 |
1
2
3
4
5
|
$パターン="/(d{4}(W )d{2}Wd{2})s (d{2}(W)d{2}Wd{2})s (?:am|pm)/"; //正規表現パターン $ string="今日は 2010/09/15 15:35:28 pm..." ; //上記のパターン文字列と一致する必要がある変数文字列 span>
if(preg_match($pattern, $string, $arr)){ print_r($arr); span>
} |
结果
1
2
3
4
5
6
7
8
|
配列
(
[0] => 2010/09/15 15:35:28 午後
[1] => 2010/09/ 15
[2] => ; /
[3] => 15:35:28
[4] => :
)
|
(4) サブモード
をキャンセルして、大きな原子として使用するか、優先順位を変更します。
パターンの前に ?: を追加する限り、
1
|
(? :午前|午後) //つまり、(am|pm) をサブパターンとはみなさず、全体として am|pm を直接使用します。 |
(5) バックリファレンス
パターン内のサブパターンを直接取り出して、正規表現パターンの一部として使用できます。 preg_replace 関数の replace 関数のような正規表現で使用すると、サブパターンを取り出し、
1 を使用して最初のサブパターンを取得し、2 を使用して 2 番目のサブパターンを取得できます。置換文字列内のパターン。 , …. 5 (一重引用符で囲まれた正規表現であるか、二重引用符で囲まれた正規表現であるかに注意してください)
"\1" 二重引用符で囲まれた正規表現では、エスケープ文字を解釈できます。したがって、1 は \ 1
'1' として記述する必要があります。一重引用符で囲まれた正規表現では、これは発生しません。たとえば、
1 2
3
4
5
6
7
| $ パターン="/d{4}(W )d{2}\1d{2} s d{2}(W)d{2}\2d{2}s (?:am|pm)/"; //正規表現パターン $文字列="今日は 2010/09/15 15:35:28 pm..."; //上記のパターン文字列と一致する必要がある変数文字列
if(preg_match ($パターン, $string, $arr)){ echo "正規表現{$pattern} および文字列{$string}正常に一致しました< ;br>"; print_r($arr); エコー ''; } |
上記の例では、(W) が最初のスラッシュ/とすでに一致しているため、最初のサブパターンとして保存されており、この一致を引き続き使用したいので、単にそれを使用します。一重引用符で囲まれた正規表現であれば、直接 1 で表すことができます。次の \2 も同様の原理です。
上記の例では、最後の / の後の i u がモード補正記号です。
1) ほんの数文字
2) 一度に 1 つずつ使用でき、それぞれに特定の意味があります。複数の文字を連続して使用する 記号
3) は末尾にあり、正規表現全体のチューニングに使用されます。正規表現機能の拡張とも言えます。
は次のように分類されます:
i:
m: 文字の各行を新しい行として扱います。つまり、改行文字以降の行はすべて文字列全体として扱うことができます。主な影響は ^ 記号と $ 記号です。
例:
12
12345 $pattern = '/^abc/m'$string ='cdeabcdefg'//可以匹配成功,因为加入m之后,第二行的abcd也当做一行了,也算是以abc开头345
$パターン = '/^abc/m'$文字列 ='cdeabcdefg'//m を追加すると、2 行目の abcd も行とみなされ、abc で始まるため、照合は成功します。s: このモード補正記号が使用されない場合、" ." は改行文字として使用できません。 はい、s を追加して文字列を 1 行として扱うと、「.」も改行文字として表すことができます。 x: パターン内の空白は無視されることに注意してください。
123 $pattern = '/a b c/x'$string ='abc'//可以匹配成功,因为加入x之后,a b c直接当做abc来看
123 $パターン = '/a b c/x'$文字列 ='abc'//x を追加すると、a b c は直接 abc として見なされるため、照合は成功します。 td>e: preg_replace 関数で正規表現を使用する必要があります
A: 通常の関数で使用する必要があります式 式の先頭に ^
Z を追加するのと同じです: 正規表現で終わる必要があります。これは $
U: グリーディ モードをキャンセルするか、.*? でグリーディ モードをキャンセルすることもできますが、両方を同時に使用すると、プラスの効果とマイナスの効果が生じます。同時に表示されると、貪欲モードが再びオンになります。
要約すると、正規表現の構成は /アトムとメタキャラクター/パターン修正記号 (/ は区切り記号) ですが、一部の言語ではこれを必要としません。 Python などのこの区切り文字。 5. メタキャラクターの優先順位 (理解) 1) エスケープ文字が最も高くなります。2) ()、(?:)、{ }、その後に括弧 3)*? {}4)^ $ b5)|6. よく使用される正規表現1) チェックデジット Expression
1 数値: ^[0-9]*$2 n 桁の数値: ^d{n}$
3 n 桁以上の数値: ^d{ n,}$
4 m-n 桁の数値: ^d{m,n}$
5 ゼロで始まる数値およびゼロ以外の数値: ^(0|[1-9][0-9] *) $
6 ゼロ以外で始まり小数点以下 2 桁までの数値: ^([1-9][0-9]*) (.[0-9]{1,2})?$
7 小数点以下 1 ~ 2 桁の正または負の数: ^(-)?d (.d{1,2})?$
8 正の数、負の数、および小数: ^(-| )? d (.d )?$
9 小数点以下 2 桁の正の実数: ^[0-9] (.[0-9]{2})?$
10 1~ の正の実数小数点以下 3 桁:^[0-9] (.[0-9]{1,3})?$
11 ゼロ以外の正の整数: ^[1-9]d*$ または ^([1- 9][ 0-9]*){1,3}$ または ^ ?[1-9][0-9]*$
12 ゼロ以外の負の整数: ^-[1-9][]0 -9″ *$ または ^-[1-9]d*$
13 負でない整数: ^d $ または ^[1-9]d*|0$
14 正でない整数: ^ -[1-9 ]d*|0$ または ^((-d )|(0 ))$
15 非負の浮動小数点数: ^d (.d )?$ または ^[1-9] d*.d*|0 .d*[1-9]d*|0?.0 |0$
16 非正の浮動小数点数: ^((-d (.d )?)|(0 (.0 )?))$ または ^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0 |0$
17 正浮動小数点数: ^[1-9] d*.d*|0.d*[1-9]d*$ または ^(([0-9] .[0-9]*[1-9][ 0-9]*)|([0 -9]*[1-9][0-9]*.[0-9] )|([0-9]*[1-9][0-9] *))$
18 負の浮動小数点: ^-([1-9]d*.d*|0.d*[1-9]d*)$ または ^(-(([0-9] .[0-9]*[1- 9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9] )|([0- 9]*[1-9][0 -9]*)))$
19 浮動小数点数: ^(-?d )(.d )?$ または ^-?([1-9]d* .d*|0.d*[1- 9]d*|0?.0 |0)$2) 文字式の確認
1 漢字: ^[ u4e00-u9fa5]{0,}$2 英語と数字: ^[A-Za-z0-9] $ または ^[A-Za-z0-9]{4 ,40}$
3 長さ 3 ~ 20 のすべての文字: ^.{3,20}$
4 26 個の英字で構成される文字列: ^[A-Za-z] $
5 構成済み26 個の大文字の英字の文字列: ^[A-Z] $
6 26 個の小文字の英字の文字列: ^[a-z] $
7 数字と 26 個の英字の文字列: ^[A-Za -z0-9 ] $
8 数字、26 個の英字、またはアンダースコアで構成される文字列: ^w $ または ^w{3,20}$
9 中国語、英語、アンダースコアを含む数字: ^[ u4E00-u9FA5A-Za- z0-9_] $
10 中国語、英語、数字、ただし
下線およびその他の記号は除く: ^[u4E00-u9FA5A-Za-z0-9] $ または ^[u4E00-u9FA5A- Za-z0-9] {2,20}$11 ^%&',;=?$"を含む文字を入力できます: [^%&',;=?$x22]
12 入力禁止 ~ を含む文字: [ ^~x22]3) 特別なニーズの表現
1 メールアドレス: ^w ([- .]w )*@w ([-.]w )*.w ([-.]w )*$
2 ドメイン名: [a - zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62}) / .?
3 インターネット URL: [a-zA-z] ://[^s]* または ^http://([w-] .) [w-] (/[w-./?% & =]*)?$
4 携帯電話番号: ^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9 ]| 18[0|1|2|3|5|6|7|8|9])d{8}$
5 電話番号 ("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX- XXXXXXX" 、"XXX-XXXXXXXX"、"XXXXXXX" および "XXXXXXXX"): ^((d{3,4}-)|d{3.4}-)?d{7,8}$
6 国内電話番号(0511 -4405222、021-87888822): d{3}-d{8}|d{4}-d{7}
7 ID 番号 (15 桁、18 桁): ^d{15}|d {18}$
8 短い ID 番号 (数字、x で終わる文字): ^([0-9]){7,18}(x|X)?$ または ^d{8,18}|[ 0-9x]{8,18}|[0-9X]{8,18}?$
9 アカウントは合法ですか (文字で始まり、5 ~ 16 バイトが許可され、英数字のアンダースコアが許可されます): ^[a - zA-Z][a-zA-Z0-9_]{4,15}$
10 パスワード (文字で始まり、長さは 6 ~ 18、文字、数字、 アンダースコアのみを使用できます): ^[a-zA-Z]w{5,17}$
11 強力なパスワード (大文字、小文字、数字の組み合わせが含まれている必要があり、特殊文字は使用できません。長さは 8 ~ 10 です): ^(?= .*d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
12 日付形式: ^d{4}-d{1, 2}-d {1,2}
13 一年の 12 か月 (01~09 および 1~12): ^(0?[1-9]|1[0-2])$
14 1ヶ月31日(01~09と1~31): ^((0?[1-9])|((1|2)[0-9])|30|31)$
15 入金format :
16 1. 受け入れられる通貨表現には 4 つの形式があります: 「10000.00」と「10,000.00」、および「セント」なしの「10000」と「10,000」: ^[1-9][0-9] ]*$
17 2. これは、0 で始まらない任意の数値を意味しますが、文字「0」は渡されないことも意味するため、次の形式を使用します: ^(0|[1-9] [0-9]*)$
18 3. 0、または 0 で始まらない数値。先頭に負符号を使用することもできます: ^(0|-?[1-9][0 -9 ]*)$
19 4. これは、0 または負の可能性があり、0 で始まらない数値を意味します。ユーザーには 0 から始めてもらいます。お金を負にすることはできないため、負の符号も削除します。以下に追加する必要があるのは、考えられる小数部分を説明することです: ^[0-9] (.[0-9] )?$
20 5. の後に少なくとも 1 桁が必要であることに注意してください。小数点なので、「10.」は渡されませんが、「10」と「10.2」は渡されます: ^[0-9] (.[0-9]{2})?$
21 6.小数点の指定方法 最後に 2 桁を指定する必要がある場合は、次のようにすることもできます: ^[0-9] (.[0-9]{1,2})?$
22 7. これにより、ユーザーは小数点以下 1 桁だけを書くことができるようになります。次に、数値内のカンマを考慮します。^[0-9]{1,3}(,[0-9]{3}) )*(.[0-9]{1, 2})?$
23 8.1 ~ 3 個の数値、その後に任意の数のカンマと 3 個の数値が続きます。カンマは必須ではなくオプションになります。 ^([0-9 ] |[0-9]{1,3 }(,[0-9]{3})*)(.[0-9]{1,2})?$
24 注: これは最終的なものです結果、「」を使用できることを忘れないでください。* "空の文字列が受け入れられると思われる場合は置き換えてください (奇妙なことですが、なぜですか?) 最後に、 関数を使用するときはバックスラッシュを削除することを忘れないでください。一般的なエラーはここにあります。
25 XML ファイル: ^([a-zA-Z] -?) [a-zA-Z0-9] \.[x|X][m|M][l|L]$
26漢字の正規表現: [u4e00-u9fa5]
27 全角文字: [^x00-xff] (漢字を含む) 文字列の長さ (全角文字の長さ) を計算するために使用できます。は 2 としてカウントされ、ASCII 文字の長さは 1 としてカウントされます))
28 空白行の正規表現: ns*r (空白行の削除に使用できます)
29 HTML タグの正規表現: <(S*?)[^>]*>.* ?1>|<.* /> (インターネット上で流通しているバージョンはあまりにもひどいので、上記のものは部分的にしか効果がありません) 、複雑なネストされたタグには依然として無力です)
30 先頭および末尾の空白文字の正規表現 :^s*|s*$ または (^s*)|(s*$) (空白を削除するために使用できます)行頭と行末の文字 (スペース、タブ、フォーム フィードなどを含む)、非常に便利な式)
31 Tencent QQ 番号: [1-9][0-9]{4,} (Tencent QQ 番号は 10000 から始まります)
32 中国の郵便番号: [1-9]d{5} (?!d) (中国の郵便番号は 6 桁です)
33 IP アドレス: d .d .d .d (IP アドレスを抽出するときに役立ちます)PHP 正規表現処理関数
1. int preg_match ( string pattern, string subject [, arraymatches [, int flags]] )
使用法:
1) 件名文字列で、パターンで指定された正規表現に一致するコンテンツを検索します。
2) 一致が提供された場合は、 に検索結果が入力されます。 $matches[0] にはパターン全体に一致するテキストが含まれ、$matches[1] には括弧内の最初にキャプチャされたサブパターンに一致するテキストが含まれます。
3) flags パラメーターは PHP 4.3.0 以降で使用できます。 flags には次のタグを使用できます: PREG_OFFSET_CAPTURE
このタグが設定されている場合、一致する結果ごとに関連する結果も返されます。 .文字列オフセット。これにより、返された配列の値が変更され、その中の各セルも配列になることに注意してください。最初の項目は一致した文字列で、2 番目の項目はそのオフセットです。たとえば、次の例は URL に一致します
1234567891011121314 $str="これは 関数に一致する通常のテーブル https://www.baidu.com 式です"; 🎜>$url="/(https? | ftps?)://((www|mail|news).([^./] ).(com|org|net))/i";if(preg_match($url, $str, $arr)){echo " 文字列には正しい URL 情報が含まれています< ;br>";エコー ''<span class="crayon-s">;<span class="crayon-sy"></span></span></span></span><div id="crayon-556bae903a5ee254229729-7" class="crayon-line">print_r<span class="crayon-e">(<span class="crayon-sy">$<span class="crayon-sy">arr<span class="crayon-v">)<span class="crayon-sy">;<span class="crayon-sy"></span></span> </span> </span></span></span><div id="crayon-556bae903a5ee254229729-8" class="crayon-line crayon-striped-line">エコー<span class="crayon-i"> <span class="crayon-h">'';echo "ホスト: ".$arr[2]."
";}else{echo 「文字列に URL が含まれていません」;}
2. int preg_match_all ( string pattern, string subject [, arraymatches [, int flags]] )
は preg_match_all とまったく同じですが、すべての情報が一致します。
たとえば、次の例は、正規表現
に一致するすべてのコンテンツと一致します。1234567891011121314151617181920212223 $str=「これは通常のテーブルです https: / /www.baidu.com 式のマッチング関数これは通常のテーブルです http://www.baidu1.com 式 マッチング関数これは通常のテーブルです https://mail.baidu2.com 式マッチング関数これは通常のテーブルです https://news .baidu3.com 式マッチング関数これは通常のテーブルです https://www.baidu4.org 式マッチング関数これは通常のテーブル https://www.baidu5.net 式マッチング関数これは通常のテーブル ftps://www.baidu6 .com 式マッチング関数これは通常のテーブルです ftp://www.google7.com 式マッチング関数これは通常のテーブル https://www.baidu7.net 式です 関数";$url="/(https?|ftps?)://((www|mail|news).([^./] ).(com |org|net))/i";if(preg_match_all($url, $str, $arr)){echo "文字列
に正しいURL情報があります。" ; >print_r($arr);エコー '';echo "ホスト: ".$arr[2]."< ;br>";}else{echo"文字列はURL「;}上記の $arr の出力結果は、次々にマッチングした結果を分割していません。つまり、すべてのサブパターンが配列に書き込まれ、結果が別の配列に分割されていません。 。
結果では、0 番目の配列にはすべての完全なパターンが含まれ、最初の配列には最初のすべてのサブパターンが含まれます。
上記のコードを変更して、結果を個別に表示できます。
1
1234567891011 if(preg_match_all($url, $str, $arr,PREG_SET_ORDER)){echo "字符串中有正确的URL信息
";echo ''<span class="crayon-sy">;</span></span></span></span><div id="crayon-556bae903a605347321955-4" class="crayon-line crayon-striped-line"> <span class="crayon-e">print_r<span class="crayon-sy">(<span class="crayon-sy">$<span class="crayon-v">arr<span class="crayon-sy">)<span class="crayon-sy">;</span></span></span></span></span></span><div id="crayon-556bae903a605347321955-5" class="crayon-line"> <span class="crayon-i">echo<span class="crayon-h"> <span class="crayon-s">'';echo "主机:".$arr[2]."
";}else{echo "字符串中不包括URL";}234567891011 if(preg_match_all($url, $str, $arr,PREG_SET_ORDER)){スパン>エコー "文字列には正しい URL 情報が含まれています
";エコー ''<span class="crayon-sy">;</span>print_r($arr);エコー '< ;/pre>';エコー "ホスト:".$arr[2]."
";スパン>}else{エコー "文字列に URL が含まれていません";}上記の preg_match_all メソッドでは、PREG_SET_ORDER で 4 番目のパラメータを渡すことで、フルモードとサブモードの個別表示を実現できます。
実際、デフォルト モードのパラメータは PREG_PATTERN_ORDER です。このパラメータを渡すことは、パラメータを渡さないことと同じです。
3.mixed preg_replace(mixed pattern,mixed replace,mixed subject [,int limit])
置換関数、パターンは正規表現、replacement は置換される内容です。つまり、正規表現に一致する内容が置換で置き換えられます。件名は検索された文字列です。つまり、この文字列の内容が置き換えられます。
1
12345 $str=" 字符串中php的替换函数,系统提供的 字符串中的替换函数,系统提供的 字符串中的替换函数,系统提供的 字符串中的替换函数,系统提供的 字lamp符串中的替换函数,系统php提供的 字符串中的替换函数";echo $str."
";echo preg_replace("/[a-zA-z] /",'',$str);2345 $str=" php の文字列置換関数, システムが提供する文字列の置換関数, システムが提供する文字列の置換関数, システムが提供する文字列の置換関数, システムが提供する文字ランプ文字列の置換関数, システムが提供する文字 php Replacement文字列内の関数";エコー $str."
";echo preg_replace("/[a-zA-z] /",'',$str );このプログラムを実行すると、str 文字列内の文字は何も置き換えられません。
さらに、4 番目のパラメータである置換の数を指定できます
1
12345 $str=" 字符串中php的替换函数,系统提供的 字符串中的替换函数,系统提供的 字符串中的替换函数,系统提供的 字符串中的替换函数,系统提供的 字lamp符串中的替换函数,系统php提供的 字符串中的替换函数";echo $str."
";echo preg_replace("/[a-zA-z] /",'',$str,3);2345 $str =" php の文字列内の置換関数、システムが提供する文字列の置換関数、システムが提供する文字列の置換関数、システムが提供する文字列、システムが提供する文字列ランプの置換関数、システムが提供する文字列の置換関数 php ";エコー $str."
";< /span> <🎜><🎜>< div id="crayon-556bae903a612390352640 -5" class="crayon-line">echo preg_replace ("/[a-zA-z] /",",$str,3 ); <🎜><🎜>このようにして実現できる置換は 3 つだけです。
さらに、
< などの一般的な方法である多対多の配列置換を実現できます。 🎜>
1234567891011121314151617181920212223 $str=" string php の置換 関数、システムが提供する文字列の置換関数、システムが提供する文字列の置換関数、システムが提供する文字列の置換関数、文字列ランプの置換関数システムによって提供される 、[b] システム php によって提供される文字列の置換関数 [/b]、システム php によって提供される文字列の置換関数、システムによって提供される文字列の置換関数、文字 < ;b>apache< システムによって提供される文字列の置換関数 /b> システムによって提供される mysql 文字列の置換関数 [/u] 番号、システムによって提供される文字列の MySQL 置換関数 Apache、[ i] システムによって提供される文字列 php システム システムの置換関数 [/i] は文字列の [size=7] php 置換関数 [/size] を提供し、システムは [color=Magenta] 置換関数 [ mysql 関数を置き換える Linux 文字列内の /color]、システム PHP によって提供される文字列内の置換関数、システムによって提供される文字列内の置換関数、システム PHP によって提供される文字列内の置換関数、単語 [ align=center] string [b] システムが提供する PHP システムが提供する、提供された string[/b][/align] 内の置換 関数、システムが提供する php が提供する文字列内の置換関数、システムが提供する";エコー $ str."
";$ubbcodes=array('/ [ b](.*?)[/b]/i','/[u](.*?)[/u]/i ' 、'/[i](.*?)[/i]/i','/[color=(.* ?)](.*?)[/color]/','/[size=(.*?)](.*?)[ /size]/','/[align=(.*?)](.*?)[/align]/');$htmls=array ('1','1'、'1'、'2'、'2','2< /p>'
);