我有一个用 PHP 编写的数据库类,它应该处理一些我不想关心的事情。其中一项功能是处理使用 MySQL 的 AES 函数编码的列的解密。
这在正常情况下非常有效(我认为这意味着查询字符串“AS bla_bla”中没有别名)。假设有人编写了一个包含别名的查询字符串,其中包含脚本应该解密的列的名称,查询死了,因为我的正则表达式不仅包含了列,还包含了别名。这不是它应该的样子。
这是我写的正则表达式:
preg_replace("/(((\`|)\w+(\`|)\.|)[encrypted|column|list])/i", "AES_DECRYPT(${0},'the hash')"
带有重音的部分在那里,因为有时查询确实包含表名,该表名要么在重音内,要么不在重音内。
示例输入:
SELECT encrypted, something AS 'a_column' FROM a_table;
示例输出:
SELECT AES_DECRYPT(encrypted, 'the hash'), something AS 'a_AES_DECRYPT(column, 'the hash')' FROM a_table;
如您所见,这行不通,所以我的想法是仅搜索单词,这些单词不在单词“as”之后,直到出现特殊字符或空格。当然,我尝试了几个小时的工作,但我没有得到正确的语法。
是否可以用纯正则表达式解决这个问题,如果可以,它会是什么样子?