2008-11-21 18 views
6

Jeśli mam zapytanie, takie jak SELECT * from authors where name = @name_param, czy istnieje wyrażenie do wypakowania nazw parametrów (szczególnie "nazwa_param")?Regex do parsowania parametrów SQL

Dzięki

+0

Nie jestem pewien, o co dokładnie pytasz. Czy możesz wyjaśnić lub podać przykład? Czy chcesz przekazać listę nazw i przekonwertować WHERE na imię (name_a, name_b, ...)? i musisz określić RDBMS, wsparcie Regex jest różne między nimi. –

Odpowiedz

8

Jest to trudne, ponieważ params może również wystąpić wewnątrz cudzysłowami.

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

Jak wyrażenie regularne wiedzieć, aby użyć pierwszego @name_param ale nie drugi?

Jest to problem, który można rozwiązać, ale nie jest praktyczne, aby zrobić to w pojedynczym wyrażeniu regularnym. Musiałem sobie z tym poradzić w Zend_Db, a to, co zrobiłem, najpierw usunęło wszystkie cytowane ciągi i rozgraniczone identyfikatory, a następnie można użyć wyrażeń regularnych w pozostałej części.

Można zobaczyć kod tutaj: http://framework.zend.com/code/browse/~raw,r=8064/Zend_Framework/trunk/library/Zend/Db/Statement.php

Patrz Funkcje _stripQuoted() i _parseParameters().

+3

Nie wspominając o nazwach parametrów pojawiających się w komentarzach SQL. Regeksy są świetne, ale niekoniecznie świetnie nadają się do analizowania zadań. –

+0

Tak, dobry punkt o komentarzach SQL. –

4

Biorąc pod uwagę nie masz podane ciągi lub komentarze z parametrami w nich wymagane regex byłoby dość banalne:

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

idę z Bill Karwin's recommendation być ostrożnym, wiedząc, że naiwne podejście ma swoje pułapki. Ale jeśli wybierzesz dane, z którymi masz do czynienia, to regex będzie wszystkim, czego potrzebujesz.

+0

Mała uwaga: liczby są również poprawne w nazwach parametrów, więc wyrażenie regularne powinno być @ ([_ a-zA-Z0-9] +) – Samuel

+3

@ prawdą jest, że to prawda, ale myślę, że parametr nie może zaczynać się od cyfr, a może nawet nie z podkreśleniem. Więc użyłbym '@ ([a-zA-Z] [a-zA-Z0-9 _] *)'. – bluish

Powiązane problemy