preg_match只返回第一个匹配

时间:2016-03-03 17:07:55

标签: php regex preg-match

我编写了一个正则表达式,它应该通过给定的内容进行解析并返回一系列匹配项。 preg_match函数如下:

<?php preg_match("/\[tab *title=(\”|\"|\’|\'|).*(\”|\"|\’|\'|)\]/i", $content, $tabs); ?>

根据RegExr

,这符合以下任何一种(或变体)
[tab title="example"]
[tab  title="example"]
[tab title='example']
[tab title=example]
[TAB TITLE="example"]
[tab title=”example”]
[tab title=’example’]

我可以让我的preg_match返回一个数组,但它只显示第一个匹配:

Array
(
    [0] => [tab title=’Admission’]
    [1] => 
    [2] => 
)

我对正则表达式很新,这是我第一次尝试自己做。我确定我错过了一些明显的东西。为什么这个数组只显示第一个匹配?

我想解析的示例数据如下:

[tab-group]

[tab title='Admission']

Tab Content Here

[/tab]

[tab title="Amenities"]

Tab Content Here

[/tab]

[tab title="Season Passes"]

Tab Content Here

[/tab]

[tab title="Hours"]

Tab Content Here

[/tab]

[/tab-group]

更新:我刚刚找到了preg_match_all并且看起来匹配正确,不过它出于某种原因在最后添加了两个额外的数组:

Array
(
    [0] => Array
        (
            [0] => [tab title=’Admission’]
            [1] => [tab title=”Amenities”]
            [2] => [tab title=”Season Passes”]
            [3] => [tab title=”Hours”]
        )

    [1] => Array
        (
            [0] => 
            [1] => 
            [2] => 
            [3] => 
        )

    [2] => Array
        (
            [0] => 
            [1] => 
            [2] => 
            [3] => 
        )

)

从我的示例数据中可以清楚地了解为什么要添加这些数组?

1 个答案:

答案 0 :(得分:1)

在regexp中使用括号时,它们有两个目的:它们可用于对表达式的某些部分进行分组,并且它们还会导致与该组匹配的字符串部分被捕获&#34;并在匹配数据中返回。那些额外的数组是捕获的字符串。您可以通过将?:放在开头来使群组无法捕获:

(?:\”|\"|\’|\'|)

但是在你的正则表达式中你根本不需要组,你可以在方括号中使用字符集:

preg_match_all("/\[tab *title=[”\"’']?.*[”\"’']?\]/i", $content, $tabs);

在字符集后放置?会使其成为可选项,因此它也会匹配空字符串,就像您组中的最后一个选项一样。

.*周围有一个可选字符并不重要。它与title=.*

相同