基本的な PHP 開発チュート...LOGIN

基本的な PHP 開発チュートリアル: 正規表現内のメタ文字

1. メタキャラクター

新しい要件: d は 1 つの文字と一致することを表します。そして今、10 または 8 を一致させたいのですが、任意の数の数字をどうすればよいでしょうか?

現時点ではメタキャラクターを使用する必要があります。アトムを使用すると、1 つの文字にのみ一致することがわかりましたが、複数の文字に一致する場合には問題が発生します。
現時点では、原子を変更してより多くの機能を実現するためにメタキャラクターを使用する必要があります。

以下を恐れないでください。少しずつ実験していけばすべてが分かります。重要なことは、これらはより多用途であるということです。

見てみましょう:

21.png

  • + は前の文字

と少なくとも 1 回一致します。 コードは次のとおりです:

<?php
$zz = '/\d+/';
$string = "迪奥和奥迪250都是我最爱";
//待会儿再试试中间没有0-9的情况
//$string = "迪奥和奥迪都是我最爱";
if(preg_match($zz, $string, $matches)){
    echo '匹配到了,结果为:';
    var_dump($matches);
}else{
    echo '没有匹配到';
}
?>

一致が成功し、+ が含まれることが証明されます。 d+。 d は数字と一致し、+ は前の文字と少なくとも 1 回一致します。

  • 前の文字と 0 回または任意の回数一致します

コードは次のとおりです:

<?php
$zz = '/\w*/';
 
$string = "!@!@!!@#@!$@#!";
//$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 '没有匹配到';
}
?>

は、前と後ろの両方が gg、

、または、最も低い優先度

優先順位と or のマッチングを実験で見てみましょう

<?php
 
$zz = '/abc|bcd/';
$string1 = "abccd";
$string2 = "ggggbcd";
 
if (preg_match($zz, $string1, $matches)) {
    echo '匹配到了,结果为:';
    var_dump($matches);
} else {
    echo '没有匹配到';
}
?>

見てみましょう:

1. 最初、私のマッチングのアイデアは abccd または abbcd に一致することでした。ただし、$string1 と $string2 を一致させる場合、一致結果は

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 '没有匹配到';
}
?>

結果は次のとおりです:

22.png

結論:

1. abccd または abbcd ($string1 または $string3) は実際に一致します。

2. ただし、一致する配列にはもう 1 つの要素があり、この要素の添え字は 1 です

3. () 内の内容が一致する限り、一致したデータは添字 1 の配列要素に配置されます。

3. ^ (サーカムフレックス) は ^

<?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 は指定された文字

で始まるため、$string2 は ^

の後の文字で始まらないため、この通常のルールの変換は次のようになります。 -zA-Z0-9_少なくとも 1 文字。

4. $ (ドル記号) は $ の前の文字で終わる必要があります

<?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 を表します

5。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.したがって、境界が生じます。したがって、試合は成功です。

単語以外の境界を試してみましょう:

<?php
$zz = '/\Bthis/';
$string1 = "hellothis9";
//$string2 = "hello this9";
//$string2 = "this9中国万岁";
if (preg_match($zz, $string1, $matches)) {
    echo '匹配到了,结果为:';
    var_dump($matches);
} else {
    echo '没有匹配到';
}
?>

概要:

$string1 のマッチングは成功しますが、$string2 は失敗します。

B の後に this が続くため、これは単語の境界 (スペースと先頭と末尾) には現れません。

6. {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 までに 3 回のみ出現し、それ以上は出現できないと規定しました。 1 回以上または 1 回未満。

7. {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回。それ以外の時間はすべて間違っています

8. {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 は正常に一致しました。


次のセクション
<?php $zz = '/\d+/'; $string = "迪奥和奥迪250都是我最爱"; //待会儿再试试中间没有0-9的情况 //$string = "迪奥和奥迪都是我最爱"; if(preg_match($zz, $string, $matches)){ echo '匹配到了,结果为:'; var_dump($matches); }else{ echo '没有匹配到'; } ?>
コースウェア