提问者:小点点

PHP preg_match()不匹配所有子模式


我有一个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);

这就是$匹配包含的内容:

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第二页(page-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
)

但我希望正则表达式能够正确返回值,即使在$string中有两个分页

怎样做才能让所有的子模式都有它们的价值?

注:单词as('p','page')仅为示例。有什么话可以说。

注:以上数据只是一个例子。不要给我变通解决方案,而是给我一些对任何输入数据都有好处的东西。


共1个答案

匿名用户

可以使用分支重置组,(?|...|...)

'~^&multi&[^&]+(&((?|p-(?<sad>[1-9]\d*)|page-(?<sad>[1-9]\d*))))?&[^&]+(&((?|p-(?<gogosi>[1-9]\d*)|page-(?<gogosi>[1-9]\d*))))?&?$~J'

请参阅regex演示。

请参阅PHP演示:

$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
)