【发布时间】:2015-06-15 14:04:48
【问题描述】:
我正在尝试以 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
但是没有用。
【问题讨论】:
-
不要用 regexes 解析 SQL。 SQL 是一种递归语言,只能用 上下文无关语法... 正确解析
-
对不起,我不明白你指的是什么。 SQL 作为一种递归语言与此有什么关系?正则表达式会将其视为纯文本,在任何类型的文本上运行正则表达式都不会产生任何影响。对吗?
-
您似乎正在处理源代码以提取一些查询。你在用 grep 吗?
-
@1010 我不知道你在说什么,但我在 sublime 中使用这个正则表达式来查找这些查询并在之后替换它们。
-
@NaguibIhab:让我们用一个初始笑话来回答这个问题:“Yo dawg!我听说你喜欢 sql 查询,所以我们在 sql 查询中放置了一个 sql 查询,这样你就可以在查询你查询"...
标签: regex