PHP preg_match() 不匹配所有子模式
PHP preg_match() doesn't match all subpatterns
我有一个 preg_match() 匹配模式但没有收到预期的匹配(在第三个参数中)。
我的正则表达式模式有多个子模式。
$pattern = "~^&multi&[^&]+(&(?:(p-(?<sad>[1-9]\d*)|page-(?<sad>[1-9]\d*))))?&[^&]+(&(?:(p-(?<gogosi>[1-9]\d*)|page-(?<gogosi>[1-9]\d*))))?&?$~J";
$string = "&multi&mickael&p-23&george&page-34";
preg_match($pattern, $string, $matches);
这是 $matches 包含的内容:
Array
(
[0] => &multi&mickael&p-23&george&page-34
[1] => &p-23
[2] => p-23
[sad] =>
[3] => 23
[4] =>
[5] => &page-34
[6] => page-34
[gogosi] => 34
[7] =>
[8] => 34
)
问题是 [悲伤] 应该有 23 个值。
如果我不包含在 $string 第二页(第 34 页)中,因为是可选的 [...]
$string = "&multi&mickael&p-23&george";
[...] 我有很好的 $matches 因为我的 [sad] 得到了他的价值:
Array
(
[0] => &multi&mickael&p-23&george
[1] => &p-23
[2] => p-23
[sad] => 23
[3] => 23
)
但我希望正则表达式 return 正确赋值,即使我在 $string 中有两个分页也是如此。
如何使所有子模式都有其价值?
注:如('p'、'page')等词仅为示例。那里可以是任何单词。
注:以上数据仅为示例。不要给我变通的解决方案,但对任何输入数据都有好处。
您可以使用分支重置组,(?|...|...)
:
'~^&multi&[^&]+(&((?|p-(?<sad>[1-9]\d*)|page-(?<sad>[1-9]\d*))))?&[^&]+(&((?|p-(?<gogosi>[1-9]\d*)|page-(?<gogosi>[1-9]\d*))))?&?$~J'
参见regex demo。
查看 PHP demo:
$pattern = "~^&multi&[^&]+(&((?|p-(?<sad>[1-9]\d*)|page-(?<sad>[1-9]\d*))))?&[^&]+(&((?|p-(?<gogosi>[1-9]\d*)|page-(?<gogosi>[1-9]\d*))))?&?$~J";
$string = "&multi&mickael&p-23&george&page-34";
if (preg_match($pattern, $string, $matches)) {
print_r($matches);
}
输出:
Array
(
[0] => &multi&mickael&p-23&george&page-34
[1] => &p-23
[2] => p-23
[sad] => 23
[3] => 23
[4] => &page-34
[5] => page-34
[gogosi] => 34
[6] => 34
)
我有一个 preg_match() 匹配模式但没有收到预期的匹配(在第三个参数中)。
我的正则表达式模式有多个子模式。
$pattern = "~^&multi&[^&]+(&(?:(p-(?<sad>[1-9]\d*)|page-(?<sad>[1-9]\d*))))?&[^&]+(&(?:(p-(?<gogosi>[1-9]\d*)|page-(?<gogosi>[1-9]\d*))))?&?$~J";
$string = "&multi&mickael&p-23&george&page-34";
preg_match($pattern, $string, $matches);
这是 $matches 包含的内容:
Array
(
[0] => &multi&mickael&p-23&george&page-34
[1] => &p-23
[2] => p-23
[sad] =>
[3] => 23
[4] =>
[5] => &page-34
[6] => page-34
[gogosi] => 34
[7] =>
[8] => 34
)
问题是 [悲伤] 应该有 23 个值。
如果我不包含在 $string 第二页(第 34 页)中,因为是可选的 [...]
$string = "&multi&mickael&p-23&george";
[...] 我有很好的 $matches 因为我的 [sad] 得到了他的价值:
Array
(
[0] => &multi&mickael&p-23&george
[1] => &p-23
[2] => p-23
[sad] => 23
[3] => 23
)
但我希望正则表达式 return 正确赋值,即使我在 $string 中有两个分页也是如此。
如何使所有子模式都有其价值?
注:如('p'、'page')等词仅为示例。那里可以是任何单词。
注:以上数据仅为示例。不要给我变通的解决方案,但对任何输入数据都有好处。
您可以使用分支重置组,(?|...|...)
:
'~^&multi&[^&]+(&((?|p-(?<sad>[1-9]\d*)|page-(?<sad>[1-9]\d*))))?&[^&]+(&((?|p-(?<gogosi>[1-9]\d*)|page-(?<gogosi>[1-9]\d*))))?&?$~J'
参见regex demo。
查看 PHP demo:
$pattern = "~^&multi&[^&]+(&((?|p-(?<sad>[1-9]\d*)|page-(?<sad>[1-9]\d*))))?&[^&]+(&((?|p-(?<gogosi>[1-9]\d*)|page-(?<gogosi>[1-9]\d*))))?&?$~J";
$string = "&multi&mickael&p-23&george&page-34";
if (preg_match($pattern, $string, $matches)) {
print_r($matches);
}
输出:
Array
(
[0] => &multi&mickael&p-23&george&page-34
[1] => &p-23
[2] => p-23
[sad] => 23
[3] => 23
[4] => &page-34
[5] => page-34
[gogosi] => 34
[6] => 34
)