【问题标题】:PHP preg_match() doesn't match all subpatternsPHP preg_match() 不匹配所有子模式
【发布时间】:2019-08-17 18:17:51
【问题描述】:

我有一个 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') 之类的词只是示例。那里可以是任何单词。

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

【问题讨论】:

    标签: php regex match preg-match


    【解决方案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
    )
    

    【讨论】:

    • 感谢您的回答。但是 ('p', 'page') 之类的词只是示例。那里可以有任何词。将帮助我解决任何子模式名称或输入数据。非常感谢。
    • @ValentinTanasescu 现在查看另一个答案。
    • 非常感谢。我也可以问你为什么第四个参数 PREG_UNMATCHED_AS_NULL 不包含在 $matches 中不匹配的具有 NULL 值的子模式应该这样做吗?
    • 即使文档是这么说的,为什么从不包括在内?
    • @ValentinTanasescu 抱歉,我可能混淆了确切的行为。看起来它是一个新常量,可能有问题。
    猜你喜欢
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多