Jadual Kandungan
PHP正则中的捕获组与非捕获组,php捕获组
Rumah php教程 php手册 PHP正则中的捕获组与非捕获组,php捕获组

PHP正则中的捕获组与非捕获组,php捕获组

Jun 13, 2016 am 08:51 AM
ungkapan biasa

PHP正则中的捕获组与非捕获组,php捕获组

今天遇到一个正则匹配的问题,忽然翻到有捕获组的概念,手册上也是一略而过,百度时无意翻到C#和Java中有对正则捕获组的特殊用法,搜索关键词有PHP时竟然没有相关内容,自己试了一下,发现在PHP中也是可行的,于是总结一下,分享的同时也希望有大神和细心的学习者找到我理解中出现的问题。


 

什么是捕获组

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

<p>int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )</p>
Salin selepas log masuk

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

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

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

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

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

<span>$mode</span> = '/a=(\d+)b=(\d+)c=(\d+)/'<span>;

</span><span>$str</span>='**a=4b=98c=56**'<span>;

</span><span>$res</span>=<span>preg_match</span>(<span>$mode</span>,<span>$str</span>,<span>$match</span><span>);

</span><span>var_dump</span>(<span>$match</span>);
Salin selepas log masuk

结果如下:

<span>array</span> (size=4<span>)

  </span>0 => <span>string</span> 'a=4b=98c=56' (length=11<span>)

  </span>1 => <span>string</span> '4' (length=1<span>)

  </span>2 => <span>string</span> '98' (length=2<span>)

  </span>3 => <span>string</span> '56' (length=2)
Salin selepas log masuk

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

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

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

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


捕获组的忽略与命名

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

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

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

<span>array</span> (size=3<span>)

  </span>0 => <span>string</span> 'a=4b=98c=56' (length=11<span>)

  </span>1 => <span>string</span> '4' (length=1<span>)

  </span>2 => <span>string</span> '56' (length=2)
Salin selepas log masuk

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

<p>命名子组可以接受(?<name>), (?'name') 以及(?P<name>)语法. 之前版本仅接受(?P<name>)语法.</p>
Salin selepas log masuk

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

使用时结果为:

<span>array</span> (size=5<span>)

  </span>0 => <span>string</span> 'a=4b=98c=56' (length=11<span>)

  </span>1 => <span>string</span> '4' (length=1<span>)

  </span>'sec' => <span>string</span> '98' (length=2<span>)

  </span>2 => <span>string</span> '98' (length=2<span>)

  </span>3 => <span>string</span> '56' (length=2)
Salin selepas log masuk

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


捕获组的反向引用

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

<span>$mode</span> = '/a=(\d+)b=(\d+)c=(\d+)/'<span>;

</span><span>$str</span>='**a=4b=98c=56**'<span>;

</span><span>$rp</span>='\1/$2/\3/'<span>;

</span><span>echo</span> <span>preg_replace</span>(<span>$mode</span>,<span>$rp</span>,<span>$str</span>);<span>//</span><span>**4/98/56/**</span>
Salin selepas log masuk

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

非捕获组的用法:

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


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

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

例如:

<span>$pattern</span>='/\d(?=abc)/'<span>;

</span><span>$str</span>="ab36abc8eg"<span>;

</span><span>$res</span>=<span>preg_match</span>(<span>$pattern</span>,<span>$str</span>,<span>$match</span><span>);

</span><span>var_dump</span>(<span>$match</span>);<span>//</span><span>6</span>
Salin selepas log masuk

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


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

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

例如:

<span>$pattern</span>='/(?<=abc)\d/'<span>;

</span><span>$str</span>="ab36abc8eg"<span>;

</span><span>$res</span>=<span>preg_match</span>(<span>$pattern</span>,<span>$str</span>,<span>$match</span><span>);

</span><span>var_dump</span>(<span>$match</span>);<span>//8</span><span><br /></span>
Salin selepas log masuk

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


 

与(?=xxx)  (?!

 

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

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

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Pengesahan ungkapan biasa PHP: pengesanan format nombor Pengesahan ungkapan biasa PHP: pengesanan format nombor Mar 21, 2024 am 09:45 AM

Pengesahan ungkapan biasa PHP: Pengesanan format nombor Semasa menulis program PHP, selalunya perlu untuk mengesahkan data yang dimasukkan oleh pengguna Salah satu pengesahan biasa adalah untuk memeriksa sama ada data mematuhi format nombor yang ditentukan. Dalam PHP, anda boleh menggunakan ungkapan biasa untuk mencapai pengesahan jenis ini. Artikel ini akan memperkenalkan cara menggunakan ungkapan biasa PHP untuk mengesahkan format nombor dan memberikan contoh kod khusus. Mula-mula, mari kita lihat keperluan pengesahan format nombor biasa: Integer: hanya mengandungi nombor 0-9, boleh bermula dengan tanda tambah atau tolak dan tidak mengandungi titik perpuluhan. titik terapung

Bagaimana untuk mengesahkan alamat e-mel di Golang menggunakan ungkapan biasa? Bagaimana untuk mengesahkan alamat e-mel di Golang menggunakan ungkapan biasa? May 31, 2024 pm 01:04 PM

Untuk mengesahkan alamat e-mel di Golang menggunakan ungkapan biasa, ikut langkah berikut: Gunakan regexp.MustCompile untuk mencipta corak ungkapan biasa yang sepadan dengan format alamat e-mel yang sah. Gunakan fungsi MatchString untuk menyemak sama ada rentetan sepadan dengan corak. Corak ini merangkumi kebanyakan format alamat e-mel yang sah, termasuk: Nama pengguna tempatan boleh mengandungi huruf, nombor dan aksara khas: !.#$%&'*+/=?^_{|}~-`Nama domain mesti mengandungi sekurang-kurangnya Satu huruf, diikuti dengan huruf, nombor atau sempang Domain peringkat teratas (TLD) tidak boleh lebih daripada 63 aksara.

Bagaimana untuk memadankan cap masa menggunakan ungkapan biasa dalam Go? Bagaimana untuk memadankan cap masa menggunakan ungkapan biasa dalam Go? Jun 02, 2024 am 09:00 AM

Dalam Go, anda boleh menggunakan ungkapan biasa untuk memadankan cap masa: susun rentetan ungkapan biasa, seperti yang digunakan untuk memadankan cap masa ISO8601: ^\d{4}-\d{2}-\d{2}T \d{ 2}:\d{2}:\d{2}(\.\d+)?(Z|[+-][0-9]{2}:[0-9]{2})$ . Gunakan fungsi regexp.MatchString untuk menyemak sama ada rentetan sepadan dengan ungkapan biasa.

Kuasai ungkapan biasa dan pemprosesan rentetan dalam bahasa Go Kuasai ungkapan biasa dan pemprosesan rentetan dalam bahasa Go Nov 30, 2023 am 09:54 AM

Sebagai bahasa pengaturcaraan moden, bahasa Go menyediakan ungkapan biasa yang berkuasa dan fungsi pemprosesan rentetan, membolehkan pembangun memproses data rentetan dengan lebih cekap. Adalah sangat penting bagi pembangun untuk menguasai ungkapan biasa dan pemprosesan rentetan dalam bahasa Go. Artikel ini akan memperkenalkan secara terperinci konsep asas dan penggunaan ungkapan biasa dalam bahasa Go dan cara menggunakan bahasa Go untuk memproses rentetan. 1. Ungkapan biasa Ungkapan biasa ialah alat yang digunakan untuk menerangkan corak rentetan Mereka boleh melaksanakan operasi dengan mudah seperti padanan rentetan, carian dan penggantian.

Ungkapan biasa PHP: padanan tepat dan pengecualian kemasukan kabur Ungkapan biasa PHP: padanan tepat dan pengecualian kemasukan kabur Feb 28, 2024 pm 01:03 PM

Ungkapan Biasa PHP: Padanan Tepat dan Pengecualian Ungkapan tetap kemasukan kabur ialah alat padanan teks yang berkuasa yang boleh membantu pengaturcara melakukan carian, penggantian dan penapisan yang cekap semasa memproses teks. Dalam PHP, ungkapan biasa juga digunakan secara meluas dalam pemprosesan rentetan dan pemadanan data. Artikel ini akan menumpukan pada cara melakukan pemadanan tepat dan mengecualikan operasi kemasukan kabur dalam PHP dan akan menggambarkannya dengan contoh kod khusus. Padanan tepat Padanan tepat bermaksud padanan hanya rentetan yang memenuhi syarat yang tepat, bukan sebarang variasi atau perkataan tambahan.

Bagaimana untuk mengesahkan kata laluan menggunakan ungkapan biasa dalam Go? Bagaimana untuk mengesahkan kata laluan menggunakan ungkapan biasa dalam Go? Jun 02, 2024 pm 07:31 PM

Kaedah menggunakan ungkapan biasa untuk mengesahkan kata laluan dalam Go adalah seperti berikut: Tentukan corak ungkapan biasa yang memenuhi keperluan kata laluan minimum: sekurang-kurangnya 8 aksara, termasuk huruf kecil, huruf besar, nombor dan aksara khas. Susun corak ungkapan biasa menggunakan fungsi MustCompile daripada pakej regexp. Gunakan kaedah MatchString untuk menguji sama ada rentetan input sepadan dengan corak ungkapan biasa.

Penapisan aksara Cina: Amalan ungkapan biasa PHP Penapisan aksara Cina: Amalan ungkapan biasa PHP Mar 24, 2024 pm 04:48 PM

PHP adalah bahasa pengaturcaraan yang digunakan secara meluas, terutamanya popular dalam bidang pembangunan web. Dalam proses pembangunan web, kami sering menghadapi keperluan untuk menapis dan mengesahkan input teks oleh pengguna, antaranya penapisan aksara adalah operasi yang sangat penting. Artikel ini akan memperkenalkan cara menggunakan ungkapan biasa dalam PHP untuk melaksanakan penapisan aksara Cina dan memberikan contoh kod khusus. Pertama sekali, kita perlu menjelaskan bahawa julat Unicode aksara Cina adalah dari u4e00 hingga u9fa5, iaitu, semua aksara Cina berada dalam julat ini.

Apakah kad bebas ungkapan biasa? Apakah kad bebas ungkapan biasa? Nov 17, 2023 pm 01:40 PM

Kad bebas ungkapan biasa termasuk ".", "*", "+", "?", "^", "$", "[]", "[^]", "[a-z]", "[A-Z] " ,"[0-9]","\d","\D","\w","\W","\s&quo

See all articles