假设在 Eclipse 中打开的文件具有以下字符串
$stmt = "select addr from
student
where id=123";
$stmtA = "alter table tablename";
$stmtB = " delete from student
where school=ABC";
$var1 = "This is not a query.
Just a string";
我需要找到影响学生表和学校列的所有查询语句。搜索方式:
(?s)"(.*?)"
给我所有被引用并分布在多行中的字符串。现在,我如何增强上述正则表达式来过滤结果,以确保结果具有
1) 选择或更改或插入或删除MySQL的关键字, 和 2) 学生和学校关键字。
我认为满足上述两个条件后,我将能够提取命中学生表和学校列的字符串。有什么帮助吗?
最佳答案
(?s)".*?(?:select|alter|insert|delete).*?(?:student|school).*?"
尽管使用 [^"]*?
而不是 .*?
可能会更好。
编辑:
让我们切换到lookaheads因为在确保某些条件(如字符串长度、具有特殊的字符或 smthg)时它们是非常酷的工具:
(?s)".*?(?:select|alter|insert|delete)(?=[^"]*?student)(?=[^"]*?school).*?"
好吧,如果您对正则表达式不感兴趣,您可以停在这里,否则,作为前瞻的示例(注意:这较慢):
(?s)"(?=[^"]*?(?:select|alter|insert|delete)(?=[^"]*?student)(?=[^"]*?school).*?"
如果您有权访问原子组,那么最好这样做 ( atomic grouping ):
(?>select|alter|insert|delete)
就像第一个字母之后的一个单词无法匹配一样,它会跳过其余的单词(它们都有不同的第一个字母)。
最后,我想你可以使用 if/then/else :
(?s)".*?(?:select|alter|insert|delete).*?(?:(student)|school)(?(1).*?school|.*?student).*?"
或者类似的东西。
关于php - Eclipse:查找分布在多行中的查询字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15763134/