Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 制作一个条件正则表达式_Php_Regex - Fatal编程技术网

Php 制作一个条件正则表达式

Php 制作一个条件正则表达式,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' 我想让正则表达式在以下情况下视为有效,而在其他情况下视为无效

我正在制作一个API,我想实现一个过滤选项,所以我想用regexp验证表达式。这是表达式send-in-request

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+)*$