PHP正则表达式预匹配故障

PHP正则表达式预匹配故障,php,regex,preg-match,Php,Regex,Preg Match,我正在研究注释驱动的ACL,特别是检查语法和将给定字符串拆分为参数,如下所述。我有一个PHP正则表达式解决方案的问题 我想使用函数preg_match检查注释参数语法 所需的参数格式: foo={security module} - should pass bar={view,delete,edit} - should pass prelude={view, delete, edit} - should pass typo={x} - should pass foo={security modu

我正在研究注释驱动的ACL,特别是检查语法和将给定字符串拆分为参数,如下所述。我有一个PHP正则表达式解决方案的问题

我想使用函数preg_match检查注释参数语法

所需的参数格式:

foo={security module} - should pass
bar={view,delete,edit} - should pass
prelude={view, delete, edit} - should pass
typo={x} - should pass
foo={security module}prelude={view, delete, edit} - should pass
foo={security module} prelude={view, delete, edit} - should pass
所以我产生了^[a-z]+={{1}[a-z]+[,\s |,]{1}[a-z]+*}\s*+$regex

正则表达式的预期结构如下所示:

/-分隔符

^-单词的开头

[a-z]+-参数名foo | | bar | |随便什么

={1}-正好出现一次={序列

[a-z]+-声明参数的至少一个值

[,\s |,]{1}-仅出现一次,\s或

[a-z]+-参数名foo | | bar | |随便什么

*-捕获的逗号块后跟值0-x次

}-结束括号

\单个参数之间出现空格的次数为s*-0到x次

+-捕获整个批注参数的块,因为我希望批注至少有一个参数

当它被传递到preg_match时,我仍然得到0个返回值,0个模式有效字符串的出现

有人知道我哪里出错了吗?提前谢谢。

类似的事情

$stuff = <<< TEST
foo={security module}
bar={view,delete,edit}
prelude={view, delete, edit}
typo={x}
foo={security module}prelude={view, delete, edit}
foo={security module}prelude={view, delete, edit}
TEST;

$regex = '/(?P<name>[a-z]+)\s*=\s*\{\s*(?P<values>[a-z\s]+(?:\s*,\s*[a-z\s]+)*)\s*\}/m';
preg_match_all($regex, $stuff, $matches, PREG_SET_ORDER);
var_dump($matches);

如果不想在标记前后使用可选空格,可以删除\s*。

以下regexp有效:

^([a-z]+={[a-z]+((?:,|\s|,\s)[a-z]+)*}\s*)+$
我去掉了不必要的{1}量词,并将[,\s |,]改为?:,|\s |,\s,这允许用逗号示例2、空格示例1或逗号后跟空格示例3分隔参数


谢谢你们,你们给了我一个方向,帮助我最终克服了这个话题

我的解决方案:

\b[a-z]+\b\s*\=\s*\{\s*\b[a-z]+\b(?:(?:\s|\.)\b[a-z]+\b\s*|(?:\s*\,\s*\b[a-z]+\b\s*)*)\}\ *
和类似的,但更严格和更可读的辅助解决方案:

\b[a-z]+\b\s*\=\s*\{\s*\b[a-z]+\b(?:(?:\s|\.)\b[a-z]+\b\s*|(?:\s*\,\s*\b[a-z]+\b\s*)*)\}\ *
\b[a-z]+\b\s*=\s*\{\b[a-z]+\b(?:(?:\ |,\ ?|\.)\b[a-z]+\b)*\}\ *

仅供参考,您永远不需要{1}-如果某个事物后面没有量词,它总是正好匹配一个事件。[\s |,]这并不意味着你所说的是什么。它匹配的是一个单独的字符,,|或空白。你把它与,\s |,,,这相当于,\s?-逗号后跟空白。那么什么不应该通过呢?你能举个例子说明你没有得到预期的结果吗?第一行真的应该通过吗?它没有comma在参数之间。我刚刚学会使用word的\b边界,它有助于消除子字符串的匹配。因此我会将您的解决方案编辑为:?P\b[a-z]+\b\s*=\s*{\s*?P\b[a-z\s]+\b?:\s*,\s*\b[a-z\s]+\b*\s*}它在所有情况下都不起作用,但最重要的是,你帮助我学习了如何构造正则表达式。