Php 制作一个条件正则表达式
我正在制作一个API,我想实现一个过滤选项,所以我想用regexp验证表达式。这是表达式send-in-requestPhp 制作一个条件正则表达式,php,regex,Php,Regex,我正在制作一个API,我想实现一个过滤选项,所以我想用regexp验证表达式。这是表达式send-in-request filter[price] = gt.5 and lt.10 规则:第一个字符表示要使用的运算符示例: gt = '>' ge = '>=' lt = '<' le = '<=' eq = '=' ne = '<>' like = 'like' ilike = 'ilike' 我想让正则表达式在以下情况下视为有效,而在其他情况下视为无效
filter[price] = gt.5 and lt.10
规则:第一个字符表示要使用的运算符示例:
gt = '>'
ge = '>='
lt = '<'
le = '<='
eq = '='
ne = '<>'
like = 'like'
ilike = 'ilike'
我想让正则表达式在以下情况下视为有效,而在其他情况下视为无效
case 1: gt.5 (valid)
case 2: gt.5 and lt.10 (valid)
case 3: gt.5 and lt.10 or eq.5 (valid)
当我测试正则表达式时,它对这两种情况都有效,但它也匹配以下情况,但这些情况应该被视为无效
case 4: gt.5lt.10 (should be invalid)
case 5: gt.5and (should be invalid)
case 6: gt.5..lt.10 (should be invalid)
您可以选择使用
和
以及或
重复第二部分来匹配多个部分,并使用锚定来防止部分匹配,而不是使用if子句
注意\w
也与数字0-9匹配。在示例数据中,点后有数字,因此您可以使用\d
来代替匹配gt.5和
^[a-z]{2,5}\.\d+(?:\h+(?:and|or)\h+[a-z]{2,5}\.\d+)*$
您可以使用列出所有选项的更改(?:g[te]| l[te]eq | ne | i?like)使此部分[a-z]{2,5}
更精确。
更具体的变体可以使用交替,并使用(?1)
递归子模式,使其更加简洁
^([gl][te]|eq|ne|i?like)\.\d+(?:\h+(?:and|or)\h+(?1)\.\d+)*$
解释
^
字符串的开头
([gl][te]| eq | ne | i?like)
匹配任何备选方案
\.\d+
匹配1
和1+位
(?:
非捕获组
\h+(?:和|或)\h+/code>在1+水平空白字符之间匹配和或或
(?1)\。\d+
递归第一个子模式,并匹配
和1+位
)*
关闭组并重复0多次,以允许单个gt.5
$
字符串结尾
首先需要修复缺少的/x
标志和可读性。[gl][te]
减少前两个分支
^([gl][te]|eq|ne|i?like)\.\d+(?:\h+(?:and|or)\h+(?1)\.\d+)*$