Member 12687205 Ответов: 2

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

обновление: проблема, по-видимому, возникает только с несколькими пробелами.

2 Ответов

Рейтинг:
2

Patrice T

Вот ссылки на инструменты, помогающие создавать регулярные выражения и отлаживать их:
.Объем тестер регулярное выражение - регулярное выражение шторм[^]
Регулярное Средство Выражения Эспрессо [^]
Это показывает вам регулярное выражение в виде красивого графика, который действительно полезен для понимания того, что делает регулярное выражение:
Debuggex: онлайн-тестер визуальных регулярных выражений. JavaScript, Python и PCRE.[^]

Похоже на "(?(" не разрешается.
"/\с*разделитель\с+(?[^\ы]+)\с*;?\с*(?(((?!--|\г{д}).)*|--[^\Р]*\р)+)\г{г}\ы*;?/с"
и
"/\с*(?(((?!--|;).)+|--[^\Р]*\р)*);/с"
оказаться неправым.


Patrice T

Да, я сделал это, но" (?[" и "(?(" не допускаются

Patrice T

Больше ничем не могу вам помочь

Рейтинг:
10

Member 12687205

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


Patrice T

Если это больше не проблема, закройте вопрос, приняв хотя бы одно из решений.
Воспользуйся Принять ответ чтобы закрыть вопрос.