1. 問題の概要
メタキャラクターとアトムによる正規表現表現の入門は完了しました。まだ対処する必要がある特殊な状況がいくつかあります。
abc が 2 行目の先頭にある場合に一致させるにはどうすればよいですか?
正規表現ですべてを一致させることにあまり欲張らないようにしたいのですが、一部にしか一致しない場合はどうすればよいですか?
現時点では、通常の機能を強化するために次のパターンマッチングを使用する必要があります。
一般的に使用されるパターン マッチング文字は次のとおりです:
パターン マッチング文字の使用方法は次のとおりです:
/ 正規表現表現 / パターン マッチング文字
パターン マッチング文字はこの文の末尾に配置されます。 。例:
/w+/s
形式を明確に理解する 次に重要なことは、パターン マッチング記号の使用についての理解と記憶を強化することです。このコードを使用して、パターン マッチング文字を追加する場合と追加しない場合の違いを理解します
2. 大文字と小文字は区別されません
<?php //在后面加上了一个i $pattern = '/ABC/i'; $string = '8988abc12313'; $string1 = '11111ABC2222'; if(preg_match($pattern, $string, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else{ echo '没有匹配到'; } ?>
結論として、$string と $string1 は両方とも正常に一致します。そのため、最後に i を付けた後は、一致する内容の大文字と小文字が区別できなくなります
3. 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 '没有匹配到'; } ?>
Result:
As右に表示されています
試合は成功しました。 /^ad+/ 一致するコンテンツは a9 であり、これは行の先頭にある必要があります。 2 行目も正常に一致します。
4. s は 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 '没有匹配到'; ?>
結果は以下のようになり、マッチングは成功しました。
結論:
1. 新しい future では、future
2 の後に改行があるため、(ドット) は空白文字以外のすべての文字に一致します。したがって、1回目は失敗しました
3. 2回目は、sパターンマッチャーを追加しました。 . (ドット) を追加すると、すべての文字と一致するためです。
5. x は空白文字を無視します
1. この修飾子が設定されている場合、パターン内の空白文字は、エスケープされた文字または文字クラス内の文字を除き、完全に無視されます。
2. エスケープされていない文字クラスの外側の # 文字と次の改行文字の間の文字も無視されます
まずは空白行を無視するなどの機能を試してみましょう:
<?php $pattern = '/a b c /x'; $string = '学英语要从abc开始'; if (preg_match($pattern, $string, $matches)) { echo '匹配到了,结果为:'; var_dump($matches); } else { echo '没有匹配到'; } ?>
これも正常に一致します。
$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 '没有匹配到'; } ?>
結果も成功した試合です!
結論: x の 2 番目の特徴は無視されることであることがわかりました。# 文字と次の改行文字の間の文字も無視されます。
6. e 一致する項目を見つけて置換します
e モードは逆参照とも呼ばれます。主な機能は、正規表現の括弧内の内容を取り出し、それを置換項目に入れて元の文字列を置き換えることです。
このパターンマッチャーを使用する前に preg_replace() を使用する必要があります。
mixed preg_replace (mixed $registry match,mixed $replacement,mixed $search string)
preg_replaceの関数: $regulator matchを使用して$search文字列変数を検索します。次に、$replacement 変数を使用してそれを置き換えます。
正式な説明の前に、これまでの知識を確認してみましょう。一致する各原子の周りに括弧を付けました。
<?php //加上了括号 $pattern = '/(\d+)([a-z]+)(\d+)/'; $string = '987abc321'; if (preg_match($pattern, $string, $match)) { echo '匹配到了,结果为:'; var_dump($match); } else { echo '没有匹配到'; } ?>
右側の結果を見てみましょう
これは、前に括弧について話した内容です。 : 一致したコンテンツの外側に括弧があります。括弧内の内容も配列の要素に配置されます。写真に示すように: 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); ?>
右側の結果を観察してください
結論:
上の例では、$2 は正規表現の最初 (d+) を指します。また15個取り出すのと同じです
交換するときは$2と書きます。一致した項目を取り出して、再度一致結果を置き換えるのに使用されます。
7. 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
」まで直接一致します。最大一致が行われました。
同じコード部分に大文字の U を追加して、その効果を見てみましょう:
<?php $pattern = '/<div>.*<\/div>/U'; $string = "<div>你好</div><div>我是</div>"; if (preg_match($pattern, $string, $match)) { echo '匹配到了,结果为:'; var_dump($match); } else { echo '没有匹配到'; } ?>
出力結果を観察してください:
一致するものだけが得られたことがわかりました:
<div>Hello</div>
このようにして、規則性という貪欲な機能がキャンセルされます。最も近い一致を見つけさせれば問題ありません。
8. 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 '没有匹配到'; } ?>
結論:
Aモード修飾子を追加するときに$stringが一致できない場合は、追加せずに一致することができます
Aモード修飾子を追加したときに$string1が一致できる場合は、一致は最初から開始する必要があります
9. D $ 文字の終わりの後には復帰はありません
この修飾子が設定されている場合、パターン内のドルのメタ文字はターゲットの終わりとのみ一致します弦 。このオプションを使用しないと、ドル記号が改行文字の場合、最後の文字の前でも一致します。
<?php $pattern = '/\w+this$/'; //$pattern1 = '/\w+this$/D'; $string = "hellothis "; if (preg_match($pattern, $string, $match)) { echo '匹配到了,结果为:'; var_dump($match); } else { echo '没有匹配到'; } ?>
結果は右の通りです
結論:
1. たとえば、パターンが $string と一致する場合、$string の文字列 this の後にキャリッジリターンがあります。 D マッチング文字を追加しなくても正常にマッチングすることもできます
2 たとえば、パターンが $string に一致する場合、D が追加されます。 $string の文字列 this の後にスペースがあるため、一致は失敗します。
次のセクション