PHP正規表現のパターン修飾子

メタキャラクターとアトムによる正規表現表現の入門が完了しました。まだ対処する必要がある特殊な状況がいくつかあります。

abc が 2 行目の先頭にある場合に一致させるにはどうすればよいですか?
正規表現ですべてを一致させることにあまり欲張らないようにしたいのですが、一部にしか一致しない場合はどうすればよいですか?

現時点では、通常の機能を強化するために次のパターンマッチングを使用する必要があります。

一般的に使用されるパターン マッチング文字は次のとおりです:

パターン マッチング文字 関数
i パターン内の文字は大文字と小文字の両方に一致します
m文字列view 複数行の場合は、
xターゲットからのみ強制的に改行を含む単一行として文字列を扱います。 string パターン内のドルのメタ文字は、ターゲット文字列の先頭のみに一致します。
U は、ターゲット文字列の末尾のみに一致します。

パターン マッチング文字の使用方法は次のとおりです:

/正規表現の意味/パターン マッチング文字

パターン マッチング文字はこの文の最後に配置されます。例:

/w+/s

形式については明確です 次に重要なことは、パターン マッチング記号の使用についての理解と記憶を強化することです。コードを使用して、パターン マッチを追加する場合と追加しない場合の違いを理解します。

i 大文字と小文字は区別されません

<?php //在后面加上了一个i 
    $pattern = '/ABC/i'; 
$string = '8988abc12313';
$string1 = '11111ABC2222'; 
if(preg_match($pattern, $string, $matches)){
     echo '匹配到了,结果为:'; 
    var_dump($matches); }else{
     echo '没有匹配到';
     }
 ?>

結論として、$string と $string1 は両方とも正常に一致します。したがって、最後に i を追加すると、コンテンツが一致する場合は無視できます。

mは複数行として扱われます

正規表現によるマッチングの場合、通常、マッチング対象の文字列は1行として扱われます。

「行頭」メタキャラクタ (^) は文字列の先頭にのみ一致し、「行末」メタキャラクタ ($) は文字列の末尾にのみ一致します。

この修飾子が設定されている場合、「行の開始」と「行の終了」は文字列全体の先頭と末尾に一致するだけでなく、それぞれ文字列内の改行文字の前後にも一致します。

注: 一致する文字列に「n」文字がない場合、またはパターンに ^ または $ がない場合、この修飾子を設定しても効果はありません。

実験とコードを通じてこの機能を検証してみましょう:

最初の一致では、一致が失敗したことがわかります:

<?php
$pattern = '/^a\d+/';
$string = "我的未来在自己手中我需要不断的努力
a9是一个不错的字符表示
怎么办呢,其实需要不断奋进";
if (preg_match($pattern, $string, $matches)) {
    echo '匹配到了,结果为:';
    var_dump($matches);
} else {
    echo '没有匹配到';
}
?>

2 番目の一致では、m を追加します。 Try:

<?php
$pattern = '/^a\d+/m';
$string = "我的未来在自己手中我需要不断的努力
a9是一个不错的字符表示
怎么办呢,其实需要不断奋进";
if (preg_match($pattern, $string, $matches)) {
    echo '匹配到了,结果为:';
    var_dump($matches);
} else {
    echo '没有匹配到';
}
?>

結果:

QQ截图20161114141159.png

そうそう!試合は成功した。 /^ad+/ 一致するコンテンツは a9 であり、これは行の先頭にある必要があります。 2 行目も正常に一致します。

は 1 つの行として認識されます

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

1回目は、パターンマッチング文字sを追加せずに:

<?php

$pattern = '/新的未来.+\d+/';

$string = '新的未来
987654321';

if (preg_match($pattern, $string, $matches)) {
   echo '匹配到了,结果为:';
   var_dump($matches);
} else {
   echo '没有匹配到';
}

?>

2回目は、正規表現の後にパターンマッチング文字sを追加:

<?php

$pattern = '/新的未来.+\d+/s';

$string = "新的未来
987654321";

if (preg_match($pattern, $string, $matches)) {
   echo '匹配到了,结果为:';
   var_dump($matches);
} else {
   echo '没有匹配到';
}

?>

結果は以下のようになり、マッチングは成功しました。

QQ截图20161114141235.png

結論:

1. 新しい future では、future の後に改行があるため

2. そして、(ドット) は空白文字以外のすべての文字と一致します。そのため、1回目は失敗でした

3. 2回目は、sパターンマッチャーを追加しました。 . (ドット) を追加すると、すべての文字と一致するためです。

x 空白文字を無視する

1. この修飾子が設定されている場合、エスケープされた文字または文字クラス内の空白文字を除き、パターン内の空白文字は完全に無視されます。

2. エスケープされていない文字クラス外の # 文字と次の改行文字の間の文字も無視されます。

まずは空白行の無視などの機能を試してみましょう:

<?php

$pattern = '/a b c /x';

$string = '学英语要从abc开始';

if (preg_match($pattern, $string, $matches)) {
   echo '匹配到了,结果为:';
   var_dump($matches);
} else {
   echo '没有匹配到';
}

?>

これも正常に一致します。

QQ截图20161114141325.png

$pattern にはスペースがあり、各 abc の後にはスペースがあります。 $string にはスペースは含まれません。
つまり、x は空白文字を無視します。

2番目の文は文字通り理解するのがさらに困難です、

<?php
//重点观察这一行
$pattern = '/a b c #我来写一个注释
/x';

$string = '学英语要从abc开始';

if (preg_match($pattern, $string, $matches)) {
   echo '匹配到了,结果为:';
   var_dump($matches);
} else {
   echo '没有匹配到';
}

?>

結果も成功した試合です!

QQ截图20161114141359.png

x の 2 番目の特徴は無視されることであることがわかりました。# 文字と次の改行文字の間の文字も無視されます。

e 一致する項目を見つけて置換します

  • e モードは逆参照とも呼ばれます。主な機能は、正規表現の括弧内の内容を取り出し、それを置換項目に入れて元の文字列を置き換えることです。

  • このパターンマッチャーを使用する前に preg_replace() を使用する必要があります。

mixed preg_replace (mixed $registry match,mixed $replacement,mixed $search string)

  • preg_replace 関数: $lookup 文字列変数を見つけるには、$normal match を使用します。次に、$replacement 変数を使用してそれを置き換えます。

正式な説明の前に、これまでの知識を確認してみましょう。一致する各原子の周りに括弧を付けました:

<?php
//加上了括号
$pattern = '/(\d+)([a-z]+)(\d+)/';

$string = '987abc321';

if (preg_match($pattern, $string, $match)) {
   echo '匹配到了,结果为:';
   var_dump($match);

} else {
   echo '没有匹配到';
}
?>

結果を見てみましょう:

QQ截图20161114141456.png

これは以前に行ったことです。かっこについて話す場合: 一致したコンテンツの外側にかっこがあります。括弧内の内容も配列の要素に配置されます。写真に示すように: 987、abc、321。

次に正規表現の e パターンを見てみましょう:

<?php
$string = "{April 15, 2003}";

//'w'匹配字母,数字和下划线,'d'匹配0-99数字,'+'元字符规定其前导字符必须在目标对象中连续出现一次或多次
$pattern = "/{(\w+) (\d+), (\d+)}/i";

$replacement = "$2";

//字符串被替换为与第 n 个被捕获的括号内的子模式所匹配的文本
echo preg_replace($pattern, $replacement, $string);

?>

実行結果を見てみましょう:

QQ截图20161114141532.png

結論: 上の例の

$2 は正規表現の最初の (d+) を指します。表現 )。また15を取り出す感じです

交換するときは$2と書きます。一致した項目を取り出して、再度一致結果を置き換えるのに使用されます。

U 貪欲モード制御

正規表現はデフォルトで貪欲、つまり可能な限り一致します。

正規表現がどれほど貪欲であるかを見てみましょう:

<?php
$pattern = '/<div>.*<\/div>/';

$string = "<div>你好</div><div>我是</div>";

if (preg_match($pattern, $string, $match)) {
   echo '匹配到了,结果为:';
   var_dump($match);
} else {
   echo '没有匹配到';
}

?>

結果を見て、次の結論を得ましょう。 「

Hello」から「I am

」まで直接一致します。最大一致が行われました。

QQ截图20161114141617.png

同じコード部分に大文字の U を追加して、その効果を見てみましょう:

<?php
$pattern = '/<div>.*<\/div>/U';

$string = "<div>你好</div><div>我是</div>";

if (preg_match($pattern, $string, $match)) {
   echo '匹配到了,结果为:';
   var_dump($match);
} else {
   echo '没有匹配到';
}

?>

QQ截图20161114141652.png

一致するものだけが得られることがわかりました:

<div>你好</div>

このようにして、正規表現の貪欲な機能がキャンセルされます。最も近い一致を見つけさせれば問題ありません。

A はターゲット文字列の先頭から一致します

このパターンは、メタキャラクターの ^ (サーカムフレックス) 効果に似ています。

<?php

$pattern = '/this/A';

$string = 'hello this is a ';
//$string1 = 'this is a ';

if (preg_match($pattern, $string, $match)) {
   echo '匹配到了,结果为:';
   var_dump($match);
} else {
   echo '没有匹配到';
}

?>

結論:

1. A モード修飾子を追加したときに $string が照合できない場合は、追加せずに照合できます

2. A モード修飾子を追加したときに $string1 が照合できる場合、先頭から照合を開始します

D 終了 $ 文字の後にはキャリッジ リターンは許可されません

この修飾子が設定されている場合、パターン内のドル メタ文字はターゲット文字列の末尾にのみ一致します。このオプションを使用しないと、ドル記号が改行文字の場合、最後の文字の前でも一致します。

<?php 
$pattern = '/\w+this$/'; 
$pattern1 = '/\w+this$/D'; 
$string = "hellothis "; 
if (preg_match($pattern1, $string, $match)) {
echo '匹配到了,结果为:'; 
var_dump($match);
}else {
echo '没有匹配到'; 
} 
?>

結論:

1. たとえば、パターンが $string に一致する場合、$string の文字列 this の後にキャリッジ リターンがあります。 D マッチング文字

2 を追加しなくても、正常にマッチングすることもできます。たとえば、パターンが $string と一致する場合、D が追加されます。 $string の文字列 this の後にスペースがあるため、一致は失敗します。


学び続ける
||
<?php $pattern = '/this/A'; $string = 'hello this is a '; //$string1 = 'this is a '; if (preg_match($pattern, $string, $match)) { echo '匹配到了,结果为:'; var_dump($match); } else { echo '没有匹配到'; } ?>
  • おすすめコース
  • コースウェアのダウンロード
現時点ではコースウェアはダウンロードできません。現在スタッフが整理中です。今後もこのコースにもっと注目してください〜