Regex для анализа параметров SQL - PullRequest
6 голосов
/ 21 ноября 2008

Если у меня есть запрос типа SELECT * from authors where name = @name_param, есть ли регулярное выражение для анализа имен параметров (в частности, "name_param")?

Спасибо

Ответы [ 2 ]

8 голосов
/ 21 ноября 2008

Это сложно, потому что параметры могут также встречаться внутри строк в кавычках.

SELECT * FROM authors WHERE name = @name_param 
  AND string = 'don\'t use @name_param';

Как регулярное выражение узнает, что используется первое @name_param, а не второе?

Это проблема, которую можно решить, но не практично делать это в одном регулярном выражении. Я должен был обработать это в Zend_Db, и сначала я удалил все строки в кавычках и идентификаторы с разделителями, а затем вы можете использовать регулярные выражения для остатка.

Вы можете увидеть код здесь: http://framework.zend.com/code/browse/~raw,r=8064/Zend_Framework/trunk/library/Zend/Db/Statement.php

См. Функции _stripQuoted() и _parseParameters().

4 голосов
/ 21 ноября 2008

Если у вас нет строк в кавычках или комментариев с параметрами в них, требуемое регулярное выражение будет довольно тривиальным:

@([_a-zA-Z]+)       /* match group 1 contains the name only */

Я согласен с рекомендацией Билла Карвина быть осторожным, зная, что у наивного подхода есть свои подводные камни. Но если вы знаете, с какими данными вы работаете, это регулярное выражение будет всем, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...