preg_match 只返回第一个匹配项
preg_match only returning the first match
我已经编写了一个正则表达式,它应该通过给定的内容和 return 一组匹配项进行解析。 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 到 return 一个数组,但它只显示第一个匹配项:
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] =>
)
)
根据我的示例数据,是否清楚为什么要添加这些数组?
当您在正则表达式中使用圆括号时,它们有两个用途:它们可用于对表达式的各个部分进行分组,并且它们还会使与该组匹配的字符串部分成为 "captured" 和在匹配数据中返回。那些额外的数组是捕获的字符串。您可以通过将 ?:
放在开头来使组不捕获:
(?:\”|\"|\’|\'|)
但是在你的正则表达式中你根本不需要分组,你可以在方括号中使用字符集:
preg_match_all("/\[tab *title=[”\"’']?.*[”\"’']?\]/i", $content, $tabs);
在字符集后面加上 ?
使其成为可选的,因此它也将匹配空字符串,就像您所在组的最后一个选择一样。
但是在 .*
周围设置一个可选字符没有多大意义。它将匹配与 title=.*
相同的内容
我已经编写了一个正则表达式,它应该通过给定的内容和 return 一组匹配项进行解析。 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 到 return 一个数组,但它只显示第一个匹配项:
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] =>
)
)
根据我的示例数据,是否清楚为什么要添加这些数组?
当您在正则表达式中使用圆括号时,它们有两个用途:它们可用于对表达式的各个部分进行分组,并且它们还会使与该组匹配的字符串部分成为 "captured" 和在匹配数据中返回。那些额外的数组是捕获的字符串。您可以通过将 ?:
放在开头来使组不捕获:
(?:\”|\"|\’|\'|)
但是在你的正则表达式中你根本不需要分组,你可以在方括号中使用字符集:
preg_match_all("/\[tab *title=[”\"’']?.*[”\"’']?\]/i", $content, $tabs);
在字符集后面加上 ?
使其成为可选的,因此它也将匹配空字符串,就像您所在组的最后一个选择一样。
但是在 .*
周围设置一个可选字符没有多大意义。它将匹配与 title=.*