2009-07-13 3 views
0

Я принимаю создание выписки запросов из SQLite, как это:SQLite автоинкремент регулярного выражение

CREATE TABLE [users] ([id] INTEGER PRIMARY KEY AUTOINCREMENT, [username] VARCHAR, [password] VARCHAR, [default_project] VARCHAR) 

созданных с помощью

SELECT sql FROM sqlite_master WHERE type = 'table' AND name = :table 

и определения поля автоинкрементного с регулярным выражением, как это:

/\b\[?id\]?\s+INTEGER\s+PRIMARY\s+KEY\s+AUTOINCREMENT\b/Ui 

проблема заключается в том, что существуют различные приемлемые способы записи таких ключевых слов, как "id", `id`, 'id'. Показанный здесь http://www.sqlite.org/lang_keywords.html

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

$pattern = "/\b\"(id)|(\"id\")|(\[id\])|(`id`)|('id')\"\s+INTEGER\s+PRIMARY\s+KEY\s+AUTOINCREMENT\b/Ui"; 

однако есть пара проблем с это ... одно из того, что INTEGER PRIMARY KEY AUTOINCREMENT больше не проверено на ... и что ('id') не соответствует должным образом ... однако, если бы я должен был заменить его на ("id") ... чем он будет работать, и ("id") wouldn «т.

ответ

0
/(\"id\"|\[id\]|\'id\'|`id`|\\bid)\s+INTEGER\s+PRIMARY\s+KEY\s+AUTOINCREMENT/Ui 

, как представляется, работает должным образом.

0

[id] не соответствует [id] но только i и d, что вы ищете, вероятно:

$pattern = "/\s(\"[a-z]+\"|\[[a-z]+\]|'[a-z]+'|[a-z]+)\s+INTEGER\s+PRIMARY\s+KEY\s+AUTOINCREMENT/Ui"; 

с помощью [a-z]+, так что вы можете сопоставить любое алфавитное имя поля, а затем найти его в первом match (также обратите внимание, что могут быть rowids, которые не используют ключевое слово AUTOINCREMENT: они оба действительны, но с slightly different meaning).

Смежные вопросы