【问题标题】:preg_match only returning the first matchpreg_match 只返回第一个匹配
【发布时间】:2016-03-03 17:07:55
【问题描述】:

我编写了一个正则表达式,它应该解析给定的内容并返回一个匹配数组。 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] => 
        )

)

根据我的示例数据,是否清楚为什么要添加这些数组?

【问题讨论】:

  • 谢谢,我刚刚在另一个问题中看到并尝试了。它似乎确实有效,但有一个问题。在 30 秒内更新问题。
  • 阅读我提供的php.net页面,它解释了matches[0]、matches[1]...matches[n]包含什么以及为什么...
  • 额外的数组用于括号中的捕获组。如果您不想返回它们,请使用带有(?:...)的非捕获组@
  • 另外,您可以在群组中使用[xyz],而不是(x|y|z)

标签: php regex preg-match


【解决方案1】:

当您在正则表达式中使用括号时,它们有两个用途:它们可用于对表达式的各个部分进行分组,并且它们还会导致与该组匹配的字符串部分被“捕获”并在匹配中返回数据。那些额外的数组是捕获的字符串。您可以通过将?: 放在开头来使组不捕获:

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

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

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

? 放在字符集之后使其可选,因此它也将匹配空字符串,就像您组的最后一个替代项一样。

但是在.* 周围有一个可选字符没有多大意义。它将与title=.*匹配相同的东西

【讨论】:

  • 非常感谢!我的建议和@GarryWeldings 帮助我解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 2012-09-30
  • 1970-01-01
相关资源
最近更新 更多