2

我尝试构建一个从 html 模板中捕获变量的小系统。

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

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

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'e 使用的修改是:i 用于不区分大小写 m 用于允许我的字符串为多行 U - 非贪婪

我不知道我做错了什么。

任何帮助将不胜感激

4

1 回答 1

4

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

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

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

  3. 修饰符m被称为multiline,但这有点误导,它只影响锚点^,并且$还匹配行的开始和结束,而不仅仅是字符串。

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

  4. 修饰符U使您的整个正则表达式变得不贪婪。这不是您想要的,因为它也会影响您的可选组,并且因为它位于模式的末尾,所以它永远不会匹配。

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

    所以我会删除U并只使第一个量词变得不贪婪,方法是?在它之后添加一个。

所以我认为你的正则表达式应该是:

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

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

在 Regexr 上查看

于 2012-12-12T08:12:17.013 回答