繁体   English   中英

php preg_match可选子模式

[英]php preg_match optional sub pattern

我试图建立一个小的系统,从html模板捕获变量。

定义为@ XXX @的变量,并且可能(但不是必需)具有用冒号(:)发送的额外参数,即@ XXX @:j以json编码的形式发送数据。

我要做的是创建一个preg_match_all来捕获变量和那些额外的参数。 所以我想出了这个预料:

preg_match_all("/(@.*@(?:(j|n|x|z))?)/imU", $string,$this->localVariables,PREG_PATTERN_ORDER);

j | n | x | z是可能的可用附加参数。

我发送到$ string的字符串是:@ geterr @ @ domain @:j @ jhon @:n

我从preg_match_all得到的结果是:

Array
(
[0] => Array
    (
        [0] => @geterr@
        [1] => @domain@
        [2] => @jhon@
    )

[1] => Array
    (
        [0] => @geterr@
        [1] => @domain@
        [2] => @jhon@
    )

[2] => Array
    (
        [0] => 
        [1] => 
        [2] => 
    )

)

我知道(或认为我知道)?:用于可选子模式,iv所使用的修改是:i表示不区分大小写的m,以允许我的字符串为多行U-不贪心

我没有其他线索我做错了什么。

任何帮助都应给予极大的帮助

您的模式/(@.*@(?:(j|n|x|z))?)/imU有一些问题

  1. 您不需要围绕整个模式的捕获组。

  2. ?:正在创建一个非捕获组,它不仅限于可选组。

  3. 修饰符m称为multiline ,但这有点误导,它仅影响锚^$来匹配行的开头和结尾,而不仅匹配字符串。

    您想要的是修饰符s ,即singleline修饰符。 它将整个字符串视为一行,并影响. 匹配换行符。

  4. 修饰符U使您的整个正则表达式不一致。 这不是您想要的,因为它还会影响您的可选组,并且因为它位于模式的末尾,因此永远不会匹配。

  5. 您需要在字符串中匹配:

    因此,我将通过添加?来删除U并使仅第一个量词变得不协调? 之后。

因此,我认为您的正则表达式应为:

/@(.*?)@(?::(j|n|x|z))?/is

这会将第一部分放在第一个捕获组中的@和第二个捕获组中的参数之间。

在Regexr上查看

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM