我试图在开始时选择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
但它不起作用。
答案 0 :(得分:2)
由于@CommuSoft注释,SQL查询的结构无法使用正则表达式正确识别。
但是如果你只是想在你的源代码中找到所有包含以SELECT开头并且使用LIMIT一词并允许EOL在引号之间的查询的字符串,你可以使用类似的东西:
\"SELECT([^"]|\n|\"[^";]*\")*LIMIT([^"]|\n|\"[^";]*\")*\";
DEMO here
此正则表达式将匹配以双引号分隔的字符串与SELECT和LIMIT,并允许在零或更多之间
\n
;
这可能会满足您的需求,但这取决于您的代码是什么样的。例如,如果您构建查询链接变量,它将无法工作。
请注意,根据操作系统,行尾标记可以是\ r \ n或\ r \ n。