PHP pcre regex для разбора SQL с разделителями/комментарии
я пытаюсь использовать регулярные выражения для извлечения сингулярных SQL-операторов из файла, содержащего несколько sql-операторов и альтернативные разделители/комментарии.
я пытаюсь сопоставить следующие шаблоны, чтобы изолировать операторы sql, а затем, изолировав отдельный оператор, очистить его от комментариев:
"разделитель (del) (небелая последовательность пробелов) (не (del) или комментарий с (del)) (del)"
"(нет ; ) ;"
первый шаблон должен позволять использовать любой набор символов для разделителя
Что я уже пробовал:
я попробовал следующее, чтобы соответствовать первому шаблону:
"/\с*разделитель\с+(?&ЛТ;д&ГТ;[^\ы]+)\с*;?\ы*(?&л;функции qstr&ГТ;(((?!--|\г{д}).)*|--[^\Р]*\р)+)\г{г}\ы*;?/с"
и если первый паттерн терпит неудачу, чтобы соответствовать второму паттерну:
"/\с*(?&л;функции qstr&ГТ;(((?!--|;).)+|--[^\Р]*\р)*);/с"
чтобы соответствовать второму случаю
затем, если что-либо из них удастся, замените следующее пустой строкой:
"/--[^\n\r]*(?:\n / \r)+/"
моя проблема заключается в том, что apache падает на preg_match, когда я пытаюсь найти любое из первых 2 регулярных выражений в следующей строке:
"ограничитель $$
создать таблицу MovieDetail
(
imdbid varchar (32) первичный ключ not null,
название варчар(512),
год int,
номинальный варчар(16),
выпущено инт,
во время выполнения инт,
режиссер варчар (128),
писатель варчар (12),
сюжет варчар(2048),
imageurl varchar(512),
номинальный поплавок,
ratingcount int,
тип varchar(64)
); $$
определите этот текст как отдельное утверждение"
я попытался заменить escape-последовательности на / / like / / s и / / g, и он все равно вылетает точно так же
я использую XAMPP с Apache 2.4.17 и PHP 5.6.23 (vc11 X86 32bit thread safe) + PEAR
я попробовал проверить их на себе debugex.com и оба выражения справедливы.
основное обновление: похоже, что проблема проявляется только тогда, когда я использую run the expressions для многострочных строк, поэтому я попытаюсь сравнить двоичные данные 2 строк, где я заменяю разрыв строки на \n или \r\n
обновление: проблема, по-видимому, возникает только с несколькими пробелами.