Regex для преобразования синтаксиса MySQL SQL в совместимый с SQLite синтаксис (простой случай) - PullRequest
0 голосов
/ 14 апреля 2011

Я хочу преобразовать следующий SQL-запрос:

'UNIQUE KEY `UNIQUE_TAG` (`identifier`,`keyname`)'

в это:

'CONSTRAINT `UNIQUE_TAG` UNIQUE (`identifier`,`keyname`)'

Моя проблема в том, что я должен взять первое ключевое слово как переменную, например:

'<$1> KEY `UNIQUE_TAG` (`identifier`,`keyname`)'

чтобы получить его здесь

'CONSTRAINT `UNIQUE_TAG` <$1> (`identifier`,`keyname`)'

Взгляните на http://www.sqlite.org/lang_createtable.html, чтобы увидеть синтаксис SQL-совместимого SQL.

Я хочу сделать это на PHP, но я не знаю, как это сделать.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 14 апреля 2011

Ваш синтаксис был недалеко.

Этот пример должен помочь:

$query = "UNIQUE KEY `UNIQUE_TAG` (`identifier`,`keyname`)";

$regex = "/\b([^ ]+) KEY ([^ ]+) \(([^)]+)\)/";
$substitution = "CONSTRAINT $2 $1 ($3)";

$results = preg_replace($regex, $substitution, $query);

print $results;

Некоторые объяснения:

  • \b соответствует граница слова (начало строки или пробела)
  • [^ ] соответствует непробельным символам, а [^ ]+ соответствует непробельным символам один или несколько раз
  • (...) захватывает все, что .... На эту захваченную группу можно ссылаться в строке подстановки $1 (так как это первая группа захвата)
  • [^)]+ соответствует строке не закрывающих скобок длиной не менее одного символа

Менее читаемое, но более обобщенное соответствие:

$regex = "/\b(\w+)\h+KEY\h+(\H+)\h+\(([^)]+)\)/";

Дальнейшее объяснение:

  • \w+ соответствует одному или нескольким символам "слова"
  • \h+ соответствует одному или нескольким горизонтальным пробельным символам (табуляции и пробелов)
  • \H соответствует одному или нескольким не «горизонтальным пробелам» символам (галочки не являются символами слов)
0 голосов
/ 14 апреля 2011

Попробуйте это регулярное выражение (UNIQUE )?KEY (.+) (\(.+\)) и замените на CONSTRAINT $2 $1$3

<?php
$sourcestring="UNIQUE KEY `UNIQUE_TAG` (`identifier`,`keyname`)";
echo preg_replace('/(UNIQUE )?KEY (.+) (\(.+\))/','CONSTRAINT $2 $1$3',$sourcestring);
?>

http://www.myregextester.com/?r=83cd23ec

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