Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Erfassungsgruppen und nicht-Erfassungsgruppen

PHP-Erfassungsgruppen und nicht-Erfassungsgruppen

墨辰丷
墨辰丷Original
2018-06-06 11:01:061274Durchsuche

In diesem Artikel werden hauptsächlich relevante Informationen zum Erfassen von Gruppen und Nicht-Erfassen von Gruppen regulärer PHP-Ausdrücke vorgestellt. Freunde, die sie benötigen, können darauf verweisen.

Ich bin heute auf ein reguläres Matching-Problem gestoßen und habe das plötzlich gefunden Es gibt auch Capture. Als ich mich an Baidu wandte, stellte ich versehentlich fest, dass es in C# und Java spezielle Verwendungszwecke gibt Inhalt Ich habe es selbst ausprobiert und festgestellt, dass es in PHP auch machbar ist, daher werde ich es zusammenfassen. Ich hoffe auch, dass einige Experten und sorgfältige Lernende die Probleme in meinem Verständnis finden können.

Was ist eine Erfassungsgruppe?

Syntax der Erfassungsgruppe:

Zeichen

Beschreibung

Beispiel

(Muster)

entspricht Muster und Erfassungen Dadurch wird die Gruppennummer automatisch festgelegt.

(abc)+d

entspricht abcd oder abcabcd

(?c833c38bc90d42ad60588697edbe444dMuster)

oder

( ?'Name'Muster)

stimmt mit dem Muster überein, erfasst das Ergebnis und setzt den Namen auf den Gruppennamen.

num

Rückverweis auf die erfassende Gruppe. wobei num eine positive ganze Zahl ist.

(w)(w)21

passt zu abba

k6510c1df21e5f163262304744cfb034d

oder

k'name'

Rückverweis auf die benannte Capture-Gruppe. Dabei ist Name der Name der Erfassungsgruppe.

(?1cd70caa06cc6f4a046ab31342a5e7b4w)abck1cd70caa06cc6f4a046ab31342a5e7b4

entspricht xabcx

我们先看一下PHP的正则匹配函数

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

前面两项是我们常用的,$pattern是正则匹配模式,$string是要匹配的字符串。

array &$match,它是一个数组,&表示匹配出来的结果会被写入$match中。

int $flags 如果传递了这个标记, 对于每一个出现的匹配返回时会附加字符串偏移量(相对于目标字符串的)。

int $offset 用于指定从目标字符串的某个未知开始搜索(单位是字节)。

我们主要看一下$match的值里会有什么:

$mode = '/a=(\d+)b=(\d+)c=(\d+)/';
$str='**a=4b=98c=56**';
$res=preg_match($mode,$str,$match);
var_dump($match);

结果如下:

array (size=4)
  0 => 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)。

非捕获组的用法:

非捕获组语法:

字符 

描述

Beispiel

(?:Muster)

Entspricht dem Muster, erfasst aber nicht das Übereinstimmungsergebnis.

'industr(?:y|ies)

entspricht 'industry' oder 'industries'.

(?=Muster)

Vorwärtssuche mit Nullbreite, keine Erfassung. Übereinstimmungsergebnisse .

'Windows (?=95|98|NT|2000)'

stimmt mit „Windows“ in „Windows2000“ überein

stimmt nicht überein“ „Windows“ in Windows3.1“.

(?!Muster)

Negative Suche mit Nullbreite, erfasst das Übereinstimmungsergebnis nicht .

'Windows (?!95|98|NT|2000)'

stimmt mit "Windows" in "Windows3.1" überein

Keine Übereinstimmungen „Windows“ in „Windows2000“.

(?<=Muster)

Vorwärtsrückblick mit Nullbreite, Übereinstimmungen sind nicht erfasst.

'2000 (?<=Office|Word|Excel)'

stimmt mit „2000“ in „Office2000“ überein

stimmt nicht überein“ „2000“ in Windows2000“.

(?Muster)

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

'2000 (?

匹配 " Windows2000" 中的 "2000"

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

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

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

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

例如:

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

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

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

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

例如:

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

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

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

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

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

总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。

相关推荐:

PHP时间类的运用

PHP五种读取文件内容方法

PHP自定义函数实现字符串加密解密

Das obige ist der detaillierte Inhalt vonPHP-Erfassungsgruppen und nicht-Erfassungsgruppen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn