如何preg_match PCRE表达式?

时间:2019-05-27 20:17:33

标签: php regex pcre

$key="`client` asc";
preg_match('
                ~(?J)
                    \s*
                    (?:`(?P<col>(?:[^`\\\\]|\\\\.|``)*)`|(?P<col>\S+))
                    (?:\s+(?P<dir>asc|desc))?
                    \s*
                \z~Axi', $key, $m);
print_r($m);

在此处进行测试时,此正则表达式填充col

https://regex101.com/r/i00sEn/1

它在我的本地PHP 5.6计算机或此7.3解释程序上无法正常工作。

http://sandbox.onlinephpfunctions.com/code/915a26b741c6d086f21129f60af2420c74cf9f89

如果我删除反引号,那么它在任何地方都有效,但是由于此代码的目的是解析SQL ORDER BY子句,因此我需要反引号。

为什么这样做?如何获得它以正确匹配反引号?

2 个答案:

答案 0 :(得分:3)

两个组都交替使用。使用模式可能要做的是创建一个branch reset group Provider.of<int>(context)而不是一个非捕获组。

由于Wiktor Stribiżew的注释,您的模式可能如下所示:

(?|

Regex demo | Php demo

答案 1 :(得分:1)

分支重置的替代方法是使用条件

 # http://sandbox.onlinephpfunctions.com/code/551b5ecba6d554cdeff616f193fca003cd777014

 (?xis-)
 \A                                    # BOS
 \s* 
 (?:
      ( `? )                                # (1), Optional backtick
      (?<col>                               # (2 start), Col body
           (?(?<= ` )                            # Conditional, is backtick behind ?
                (?: [^`\\] | \\ . | `` )*             # yes, match backtick body
             |  \S+                                   # no, match consecutive non-whitespaces
           )
      )                                     # (2 end)
      \1                                    # Backref to optional backtick
 )
 (?:                                   # Optional column direction 
      \s+ 
      (?<dir> asc | desc )                  # (3), ascending or descending
 )?
 \s* 
 \z                                    # EOS