[英]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
有一些问题
您不需要围绕整个模式的捕获组。
?:
正在创建一个非捕获组,它不仅限于可选组。
修饰符m
称为multiline
,但这有点误导,它仅影响锚^
和$
来匹配行的开头和结尾,而不仅匹配字符串。
您想要的是修饰符s
,即singleline
修饰符。 它将整个字符串视为一行,并影响.
匹配换行符。
修饰符U
使您的整个正则表达式不一致。 这不是您想要的,因为它还会影响您的可选组,并且因为它位于模式的末尾,因此永远不会匹配。
您需要在字符串中匹配:
因此,我将通过添加?
来删除U
并使仅第一个量词变得不协调?
之后。
因此,我认为您的正则表达式应为:
/@(.*?)@(?::(j|n|x|z))?/is
这会将第一部分放在第一个捕获组中的@
和第二个捕获组中的参数之间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.