Это сложно, потому что параметры могут также встречаться внутри строк в кавычках.
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()
.