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

时间:2019-03-27 08:37:24

标签: php regex match 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);

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

问题是[sad]应该有23个值。
如果我不在$ string第二页(第34页)中,原因是可选的[...]

$string = "&multi&mickael&p-23&george";

[...]我有很好的$ matches,因为我的[悲伤]得到了他的价值:

Array
(
    [0] => &multi&mickael&p-23&george
    [1] => &p-23
    [2] => p-23
    [sad] => 23
    [3] => 23
)

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

该怎么做才能使所有子模式都具有其价值?

注意:单词(“ p”,“ page”)仅是示例。那里可以是任何单词。

注意:以上数据仅是示例。不要给我解决方法,但是对任何输入数据都有好处。

1 个答案:

答案 0 :(得分:1)

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

'~^&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
)