Разбор строки SQL

Что является хорошим методом для разбора строки sql в нее отдельными компонентами. Я пытался с регулярным выражением, но я не могу заставить его работать правильно.

Скажем, например:

"SELECT * FROM tbl WHERE user_id > 50" 

Создал бы массив со всеми компонентами

 $arr[0] = "SELECT"; $arr[1] = "*"; $arr[2] = "FROM"; 

ЭСТ …

спасибо

Я бы пошел на парсер sql, который можно было бы интегрировать на ваш язык: не изобретайте велосипед.

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

См. Также: PHP MySQL SQL-парсер (INSERT и UPDATE)

Полный синтаксис инструкции SQL SELECT очень сложный. Я думаю, вы можете ограничить себя подмножеством.

Регулярное выражение может анализировать только обычный язык . То есть язык, который может быть выражен конечным автоматом.

Большинство языков программирования, включая SQL, не могут быть выражены как обычный язык и поэтому не могут быть проанализированы с помощью регулярных выражений. Даже выполнение ограниченных задач, таких как разделение выражений SQL, будет затруднительно с регулярными выражениями.

Вам понадобится использовать более мощный генератор парсера, который может обрабатывать более сложные грамматики. Вы помечаете свой вопрос с помощью PHP, поэтому вам может понадобиться изучить Lime .

Вам также необходимо найти файл грамматики для PHP, совместимый с генератором парсера, который вы выберете. Я не уверен, где его получить для PHP и Lime, но есть чистый проект Perl под названием DBIx :: MyParsePP , основанный на грамматике MySQL.

Разбор SQL корректно и полностью затруднен. Для бесплатного использования вы можете использовать набор инструментов генератора парсеров, например ANTLR, вместе с грамматикой SQL. По стоимости я знаю, что Visual Studio Team System 2008 Database Edition содержит парсер SQL.

Пример, который вы показали, представляет собой код, который будет читать ваш оператор SQL и токенизировать с интервалом между ними и хранить каждый токен в массиве. Если вы ищете такой код кода, вы можете сделать это с помощью разделенных функций в php: http://ca.php.net/split

С Уважением,
Pooria.