ホームページ  >  記事  >  バックエンド開発  >  PHP 正規表現のキャプチャ グループと非キャプチャ グループ、php 正規表現_PHP チュートリアル

PHP 正規表現のキャプチャ グループと非キャプチャ グループ、php 正規表現_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-12 09:05:25846ブラウズ

PHP 正規表現のキャプチャ グループと非キャプチャ グループ、PHP 正規表現

今日、通常のマッチングの問題に遭遇しましたが、突然、マニュアルでスキップしていたグループのキャプチャという概念に遭遇しました。 C# と Java に目を向けると、PHP というキーワードで検索すると、関連するコンテンツがなかったので、PHP でも実行できることがわかりました。私はそれを要約し、他の人たちと共有しました。私の理解の問題点を指摘してくれる専門家や熱心な学習者がいることを願っています。

キャプチャグループとは

グループ構文のキャプチャ:

キャラクター

説明

(パターン)

パターンをマッチングして結果をキャプチャし、グループ番号を自動的に設定します。

(abc)+d

abcd または abcabcd に一致します

(?07403ed887a3d4227c84af5ca38f931fパターン)

または

(?'名前'パターン)

パターンを照合して結果をキャプチャし、名前をグループ名に設定します。

番号

キャプチャグループへの後方参照。ここで、num は正の整数です。

(w)(w)21

アバとマッチ

k55913a17fdec22d9550127218c233825 string 'a=4b=98c=56' (length=11)
  1 => string '4' (length=1)
  2 => string '98' (length=2)
  3 => string '56' (length=2)

现在我们知道了什么是捕获组,捕获组是正则表达示中以()括起来的部分,每一对()是一个捕获组。

PHP会为它编号,从1开始。至于为什么会从1开始,那是因为PHP把匹配到的完整字符串编号为0。

如果有多个括号或嵌套括号,按左边括号出现的顺序来进行编号,如图:

按图中的匹配模式匹配时,捕获组的123号分别是红绿蓝。

捕获组的忽略与命名

我们还可以阻止PHP为匹配组的编号:在匹配组中模式前加  ?:

$mode = '/a=(\d+)b=(?:\d+)c=(\d+)/';

这样,匹配结果就会变成:

array (size=3)
 0 => string 'a=4b=98c=56' (length=11)
 1 => string '4' (length=1)
 2 => string '56' (length=2)

当然,我们也可以在括号的内部为它给它独特的名字。

命名子组可以接受(?8a11bc632ea32a57b3e3693c7987c420), (?'name') 以及(?P8a11bc632ea32a57b3e3693c7987c420)语法. 之前版本仅接受(?P8a11bc632ea32a57b3e3693c7987c420)语法.

例如:$mode = '/a=(\d+)b=(?P6fd21b5631009a6df3e3d5bae31abfd3\d+)c=(\d+)/';

使用时结果为:

array (size=5)
 0 => string 'a=4b=98c=56' (length=11)
 1 => string '4' (length=1)
 'sec' => string '98' (length=2)
 2 => string '98' (length=2)
 3 => string '56' (length=2)

在保留索引数组的同时,加上一个关联项,key值为捕获组名。

捕获组的反向引用

我们在用preg_replace()函数进行正则替换时,我们还可以使用 \n 或 $n 来引用第n个捕获组.

$mode = '/a=(\d+)b=(\d+)c=(\d+)/';
$str='**a=4b=98c=56**';
$rp='\1/$2/\3/';
echo preg_replace($mode,$rp,$str);//**4/98/56/**

\1表示捕获组1(4),$2为捕获组2(98),\3为捕获组3(56)。

非捕获组的用法:

非捕获组语法:

字符 

描述

(?:パターン)

パターンに一致しますが、一致結果はキャプチャされません。

'業界(?:y|ies)

「業界」または「業界」を照合します。

(?=パターン)

ゼロ幅の前方参照。一致する結果はキャプチャされません。

「Windows (?=95|98|NT|2000)」

「Windows2000」の「Windows」と一致します

「Windows3.1」の「Windows」とは一致しません。

(?!パターン)

ゼロ幅のネガティブルックアップは、一致する結果を取得しません。

「Windows (?!95|98|NT|2000)」

「Windows3.1」の「Windows」に一致

「Windows2000」の「Windows」とは一致しません。

(?パターン)

ゼロ幅の前方ルックバック。一致する結果はキャプチャされません。

「2000 (?

「Office2000」の「2000」と一致

「Windows2000」の「2000」とは一致しません。

(?パターン)

零宽度负向回查,不捕获匹配结果。

'2000 (?

匹配 " Windows2000" 中的 "2000"

不匹配 " Office2000" 中的 "2000"。

为什么称为非捕获组呢?那是因为它们有捕获组的特性,在匹配模式的()中,但是匹配时,PHP不会为它们编组,它们只会影响匹配结果,并不作为结果输出。

/d(?=xxx)    匹配"后面是xxx的一个数字"。

注意格式:只能放在匹配模式字符串之后!

例如:

$pattern='/\d(?=abc)/';
$str="ab36abc8eg";
$res=preg_match($pattern,$str,$match);
var_dump($match);//6

匹配的6,因为只有它作为一个数字,后面还有abc。

(?<=xxx) /d 匹配"前面是xxx的一个数字"

注意格式:只能放在匹配模式字符串之前!

例如:

$pattern='/(&#63;<=abc)\d/';
$str="ab36abc8eg";
$res=preg_match($pattern,$str,$match);
var_dump($match);//8

匹配的8,因为只有它作为一个数字,后面还有abc。

与(?=xxx)  (?<=xxx)相对的是(?!=xxx)  (?

它表示前面/后面不是xxx的字符串,这里就不再举例了。

如果您觉得本博文对您有帮助,您可以推荐或关注我,如果您有什么问题,可以在下方留言讨论,谢谢。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1068823.htmlTechArticlePHP正则表达式之捕获组与非捕获组,php正则表达式 今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。