REGEX问题,选择具有多个新行的SQL查询

时间:2015-04-10 00:48:14

标签: regex

我试图在开始时选择SELECT并在最后选择LIMIT,例如:

$SelQuery = "SELECT DISTICNT C.firstname,C.lastname,C.id as clientid,QC.category_name,QR.cid,QR.catid,QR.rhid
                    FROM cms_question_report QR, cms_clients C,cms_questioncategory QC ,cms_reporthistory RH
                    WHERE C.id=QR.cid
                    AND QR.rhid=RH.id
                    AND QR.catid='".$objArray['catid']."'
                    AND QR.catid=QC.id
                    AND C.id IN($SelClids)
                    LIMIT $page_no,$this->Limit";

并且不选择任何其他不包含LIMIT的查询。所以我认为可行的正则表达式是这样的:

SELECT .*\n* LIMIT

我基本上说它必须以“SELECT”开头然后任何其他字符并以LIMIT结束,唯一的问题是我不知道如何处理\ n *,我有多个未知数量的新行和每一行都有未知字符,所以我假设它应该像这样\ n *。 \ n 。*等等,但肯定有一种方法我可以说选择包括新行的任何字符。

我尝试过使用此解决方案:Regex to match any character including new lines并将我的正则表达式调整为:

SELECT /s* LIMIT

但这并没有奏效。

也尝试过:

SELECT (.|\n)* LIMIT

但它不起作用。

1 个答案:

答案 0 :(得分:2)

由于@CommuSoft注释,SQL查询的结构无法使用正则表达式正确识别。

但是如果你只是想在你的源代码中找到所有包含以SELECT开头并且使用LIMIT一词并允许EOL在引号之间的查询的字符串,你可以使用类似的东西:

\"SELECT([^"]|\n|\"[^";]*\")*LIMIT([^"]|\n|\"[^";]*\")*\";

DEMO here

此正则表达式将匹配以双引号分隔的字符串与SELECT和LIMIT,并允许在零或更多之间

  • 不是双引号的字符
  • \n
  • 一对双引号,其中包含;
  • 之间的任何字符

这可能会满足您的需求,但这取决于您的代码是什么样的。例如,如果您构建查询链接变量,它将无法工作。

请注意,根据操作系统,行尾标记可以是\ r \ n或\ r \ n。