如何 preg_match 一个 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 子句,因此我需要反引号。


为什么这样做?我怎样才能让它正确匹配反引号?


侃侃无极
浏览 174回答 2
2回答

青春有我

您对两个组使用交替。您可以使用您的模式做的是创建一个分支重置组&nbsp;(?|而不是一个非捕获组。(?J)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \s*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (?|`(?P<col>(?:[^`\\]|\\.|``)*)`|(?P<col>\S+))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (?:\s+(?P<dir>asc|desc))?&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \s*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \z
打开App,查看更多内容
随时随地看视频慕课网APP