PHPの正規表現におけるメタキャラクター
メタキャラクター
は質問を投げます: d は文字の一致を表します。そして今、10 または 8 を一致させたいのですが、数字がいくつでもある場合はどうすればよいですか?
現時点ではメタキャラクターを使用する必要があります。アトムを使用すると、1 つの文字にのみ一致することがわかりましたが、複数の文字に一致する場合には問題が発生します。
現時点では、原子を変更してより多くの機能を実現するためにメタキャラクターを使用する必要があります。
以下を恐れないでください。少しずつ実験していけばすべてが分かります。重要なことは、これらはより多用途であるということです。
覚えやすいように小さなカードを用意するのが最善です。
見てみましょう:
メタキャラクター | 関数の説明 |
---|---|
* | は、前のアトムとの一致、前の文字との0回または任意の回数の一致を表します。 |
+ | は、前の文字の 1 つ以上と一致します |
? | 前の文字はオプションです [オプション] はいまたはいいえ |
. | はアトムとしてカウントする必要があります。 n |
またはを除くすべての文字と一致します。注: 優先度は最も低くなります。 | |
^ | はサーカムフレックス文字の後の文字列で始まらなければなりません |
$ | $ |
b | 単語境界の前の文字で終わらなければなりません |
B | 非境界性 |
{m} | はm回のみ出現できます |
{n,m} | はnからm回出現することができます |
{m,} | 少なくともm回、最大数ですは制限事項ではありません |
() | 優先順位を変更したり、特定の文字列を全体として扱い、一致したデータを取り出して使用することもできます |
+ は前の文字
<?php $zz = '/\d+/'; $string = "迪奥和奥迪250都是我最爱"; //待会儿再试试中间没有0-9的情况 //$string = "迪奥和奥迪都是我最爱"; if(preg_match($zz, $string, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>
と少なくとも 1 回一致し、d+ の + を証明します。 d は数字と一致し、+ は前の文字と少なくとも 1 回一致します。
* 前の文字と 0 回または任意の回数一致します。
<?php $zz = '/\w*/'; $string = "!@!@!!@#@!$@#!"; //待会儿再试试中间没有0-9的情况 //$string1 = "!@#!@#!abcABC#@#!"; if(preg_match($zz, $string, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>
は、コメントアウトされた $string1 と $string が正常に一致したことを示します。なぜなら、w は 0-9A-Za-z_ に一致し、* は前の w が存在しないことを意味するからです。存在する場合は 1 つ以上存在する可能性があります。
? 前の文字は 0 回または 1 回出現します。オプションの
<?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 '没有匹配到'; } ?>
は $string、$string2 と正常に一致しますが、$string1 と一致しません。
マッチングの前後に ABC があり、真ん中に 0 ~ 9 があるため、0 ~ 9 はオプションですが、複数存在することはできません。
. (ドット) は n を除くすべての文字に一致します
<?php $zz = '/gg.+gg/'; $string = "ABC1ABC"; if(preg_match($zz, $string, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>
は $string、$string2 に一致しますが、$string1 には一致しません。
マッチングの前後に ABC があり、真ん中に 0 ~ 9 があるため、0 ~ 9 はオプションですが、複数存在することはできません。
| (縦棒)、または、最も低い優先順位
優先順位と or のマッチングを実験で見てみましょう
<?php $zz = '/abc|bcd/'; $string1 = "abccd"; $string2 = "ggggbcd"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
見てみましょう:
1. 最初、私のマッチングのアイデアは次のとおりでした。 match abccd または abbcd です。ただし、$string1 と $string2 を照合すると、照合結果は abc と bcd になります。
2. 実装または照合し、照合結果は abc または bcd になります。連続する文字列よりも高い優先順位はありません。
それでは、上記の例で abccd または abbcd に一致させたい場合はどうすればよいでしょうか?
優先度を変更するには()を使用する必要があります。
<?php $zz = '/ab(c|b)cd/'; $string1 = "起来abccd阅兵"; $string2 = "ggggbcd"; $string3 = '中国abbcd未来'; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
結果は次のとおりです:
結論:
1. abccd または abbcd ($string1 または $string3) は実際に一致します。
2. ただし、一致する配列にはもう 1 つの要素があり、この要素の添え字は 1 です
3. () 内の内容が正常に一致する限り、一致したデータは配列要素に配置されます。下付き文字 1 中間。
^ (サーカムフレックス)、^ の後の文字列で始まらなければなりません
<?php $zz = '/^猪哥好帅\w+/'; $string1 = "猪哥好帅abccdaaaasds"; //$string2没有以猪哥好帅开始 $string2 = "帅abccdaaaasds"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
実験を通じて次の結論が見つかりました:
1.$string1 は正常に一致しましたが、$string2 は正常に一致しませんでした
2. $string1 は指定された文字で始まります
3. そして、$string2 は ^ の後の文字で始まりません
4. この規則の翻訳の意味は次のとおりです: Brother Zhu is so nice で始まり、次に a-zA- が続きますZ0-9_少なくとも 1 文字。
$ (ドル記号) は $ の前の文字で終わる必要があります
<?php $zz = '/\d+努力$/'; $string1 = "12321124333努力"; //$string2 $string2 = "12311124112313力"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
実行して結果を確認すると、次の結論に達します:
1. $string1 は正常に一致しましたが、$string2 は一致しませんでした
2. $ の前の文字は d+ で、その後に中国語の努力が続きます。
3. したがって、試合はこれ全体です。 d は 0 ~ 9 の整数を指し、+ 記号は少なくとも 1 つの 0 ~ 9 を表します
b および B の単語境界と非単語境界
境界とは何かを説明しましょう:
1. 正規表現の意味境界があるということは、この境界は区切り文字の始まりと終わりが規則的な境界です。
2. これは英語の単語で、その後にスペースが続きます。これは、単語が終わり、単語の境界に達したことを意味します
b単語の境界は、それが先頭または最後になければならないことを意味します。
B は非境界です。つまり、正規表現の先頭または最後に置くことはできません。
<?php $zz = '/\w+\b/'; $string1 = "this is a apple"; $string2 = "thisis a apple"; $string3 = "thisisaapple"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
結論:
1.$string1、$string2、および $string3 はすべて正常に一致しました。
2. $string1 が一致すると、このスペースが境界になります
3. $string2 が一致すると、これが境界になります
4. $string3 が一致すると、thisisaapple は正規表現全体の終わりに達するため、これも境界になります境界線。したがって、試合は成功です。
単語以外の境界を試してみましょう:
<?php $zz = '/\Bthis/'; $string1 = "hellothis9"; //$string2 = "hello this9"; //$string2 = "this9中国万岁"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
概要:
1. $string1 のマッチングは成功しますが、$string2 のマッチングは失敗します。
2. B の後に this が続くため、これは単語の境界 (スペースと先頭と末尾) に現れません。
{m} は m 回のみ出現でき、m 回のみ出現できます
<?php $zz = '/喝\d{3}酒/'; $string1 = "喝988酒"; //$string2 = "喝98811酒"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
結論:
上記の例では、d{3} は、0 ~ 9 は 1 回以上またはそれ以下ではなく、3 回のみ出現できると規定しました。
{n,m} は n 回から m 回まで出現できます
<?php $zz = '/喝\d{1,3}酒/'; $string1 = "喝9酒"; //$string2 = "喝988酒"; 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{2,}/'; $string1 = "喝9"; //$string2 = "喝98"; //$string3 = "喝98122121"; if (preg_match($zz, $string1, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
結論:
上記の例 d{2,} では、ドリンクの後ろに 0 ~ 9 が表示されると規定しています2回以上、最大でも回数に制限はありません。したがって、$string1 は一致に失敗し、$string2 は正常に一致します。 $string3 は正常に一致しました。