Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.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_Sql_Regex - Fatal编程技术网

Php 与括号之间的文本*非*匹配的正则表达式

Php 与括号之间的文本*非*匹配的正则表达式,php,sql,regex,Php,Sql,Regex,我正在寻找一个正则表达式,它将在一个PHP PCRE兼容模式中匹配下面所有粗体文本,这只是一个需要匹配的示例查询,因此它不能太具体以至于不能用于其他类似的查询 选择一个*,从表1中选择计数*作为t1,选择 将表2中的*计数为t2,从表3中选择*计数为t3, 表4中的col1、col2作为左连接从中选择g2.*、g1.id 表5为a.id上的g=g.id 更新:我的想法是匹配单词,而不是在任何括号和它之前的所有内容之间。最终目标是用COUNT替换数据库抽象层的所有粗体文本 如果您的问题是如何使用正

我正在寻找一个正则表达式,它将在一个PHP PCRE兼容模式中匹配下面所有粗体文本,这只是一个需要匹配的示例查询,因此它不能太具体以至于不能用于其他类似的查询

选择一个*,从表1中选择计数*作为t1,选择 将表2中的*计数为t2,从表3中选择*计数为t3, 表4中的col1、col2作为左连接从中选择g2.*、g1.id 表5为a.id上的g=g.id


更新:我的想法是匹配单词,而不是在任何括号和它之前的所有内容之间。最终目标是用COUNT替换数据库抽象层的所有粗体文本

如果您的问题是如何使用正则表达式查找在SQL查询的顶层选择的表达式,那么简单的答案是,您不能


SQL不是一种常规语言,任何允许嵌套括号的语言都不是,因此您就被阻止了。我认为它是一种上下文敏感语法,因此您需要一个单独的词法分析器和解析器。

对于这个问题,您不需要正则表达式

只需迭代所有字符并跟踪嵌套级别。当检测到左括号时,将嵌套级别增加1。当检测到右括号时,将嵌套级别降低1。无论何时从中找到单词,如果嵌套级别为0,则标记位置,并将子字符串从开头返回到该位置,否则忽略它并继续


如果查询无效,这将是脆弱的,但如果已知查询有效,它应该可以工作。

不确定这是否适用于正则表达式,因为您有嵌套查询。鉴于SELECT的嵌套性质,这将是困难的。为此,我们需要知道粗体部分与非粗体部分相比有什么特殊或独特之处,特别是在他们相遇的地方——否则你关于如此具体的规定就不可能做到这一点。例如,应该只包含前三个表,还是最多包含指定列的第一个表…?可以更具体一点吗?您给出的示例与问题的标题不匹配。是哪一个:粗体文本,还是不在括号内的文本?这到底是什么意思?@Miky-edits已将粗体从文本中删除