如果我有一个查询,例如
谢谢
SELECT * from authors where name = @name_param
,是否有一个正则表达式来解析参数名称(特别是 "name_param")?谢谢
这很棘手,因为params也可能出现在引号字符串中。
SELECT * FROM authors WHERE name = @name_param
AND string = 'don\'t use @name_param';
正则表达式如何知道使用第一个 @name_param
而不是第二个?
这是一个可以解决的问题,但在单个正则表达式中解决它并不实际。我曾经在 Zend_Db 中处理过这个问题,我的做法是首先去除所有带引号的字符串和定界符标识符,然后你就可以在剩余部分上使用正则表达式。
你可以查看代码,因为它是开源的。请查看函数 _stripQuoted()
和 _parseParameters()
。
https://github.com/zendframework/zf1/blob/136735e776f520b081cd374012852cb88cef9a88/library/Zend/Db/Statement.php#L200 https://github.com/zendframework/zf1/blob/136735e776f520b081cd374012852cb88cef9a88/library/Zend/Db/Statement.php#L140
假设您没有带有参数的引号字符串或注释,所需的正则表达式将非常简单:
@([_a-zA-Z]+) /* match group 1 contains the name only */
我赞同 Bill Karwin 的建议,谨慎行事,因为简单的方法有其缺陷。但是,如果您了解处理的数据,这个正则表达式就足够了。
@([a-zA-Z] [a-zA-Z0-9 _] *)
。 - bluish