2015-04-10 2 views
0

Я пытаюсь выбрать каждый запрос с SELECT, в начале и LIMIT в конце, например:REGEX вопрос, выбор запроса SQL с несколькими новыми линиями

$SelQuery = "SELECT DISTICNT C.firstname,C.lastname,C.id as clientid,QC.category_name,QR.cid,QR.catid,QR.rhid 
        FROM cms_question_report QR, cms_clients C,cms_questioncategory QC ,cms_reporthistory RH 
        WHERE C.id=QR.cid 
        AND QR.rhid=RH.id 
        AND QR.catid='".$objArray['catid']."' 
        AND QR.catid=QC.id 
        AND C.id IN($SelClids) 
        LIMIT $page_no,$this->Limit"; 

И не выбрать любой другой запрос, который Безразлично 't содержит LIMIT. Таким образом, регулярное выражение, я думал, что буду работать было так:

SELECT .*\n* LIMIT 

Где я в основном о том, что он должен начать с «SELECT», тогда любыми другими символами и заканчивается LIMIT, единственная проблема, я не знаю, как обрабатывать \ n *, у меня есть несколько неизвестных номеров новых строк, и в каждой строке есть неизвестные символы, поэтому я предполагаю, что это должно выглядеть так: \ n *. \ n. * И так далее, но определенно есть способ, где я могу сказать, выберите любого персонажа, включая новую строку.

Я попытался с помощью этого решения: Regex to match any character including new lines и регулировать мое регулярное выражение:

SELECT /s* LIMIT 

, но это не работает, как хорошо.

Также пробовал:

SELECT (.|\n)* LIMIT 

, но это не сработало.

+2

Не разбирайте * SQL * с * регулярными выражениями *. SQL является рекурсивным языком и может быть правильно проанализирован с помощью * контекстной свободной грамматики * ... –

+0

Извините, я не понимаю, о чем вы говорите. Что бы SQL-рекурсивный язык имел какое-либо отношение к этому? Regex увидит это как обычный текст, а регулярное выражение на любом виде текста не имеет никакого значения. Верный? –

+0

Кажется, вы обрабатываете исходный код для извлечения некоторых запросов. Вы используете grep? – 1010

ответ

2

В комментариях к SQL-запросам @CommuSoft SQL-запросы имеют структуру, которая не может быть правильно распознана с использованием регулярных выражений.

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

\"SELECT([^"]|\n|\"[^";]*\")*LIMIT([^"]|\n|\"[^";]*\")*\"; 

DEMO here

Это регулярное выражение будет соответствовать строке в двойных кавычках со словами выбрать и ЛИМИТ, и позволяя в пределах от нуля или более

  • символы, которые не являются двойные кавычки
  • \n
  • пару двойных кавычек с любым характером между но ;

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

Обратите внимание, что в зависимости от операционной системы знак конца строки может быть \ r \ n или \ r.

+0

Спасибо для вашего ответа. Я не понимаю эту альтернативу: \ "[^";] * \ ", из чего я понимаю, что вы ищете что-то подобное" ", а не это" ";" Почему я должен искать это в запросе? –

+0

@NaguibIhab ваши запросы построены катенацией строковых литералов между двойными кавычками и другими выражениями. Эта часть ищет такие вещи, как ''. $ ObjArray ['catid']. "', Который не может быть habe; – 1010

+0

Обратите внимание, что '[^";] 'не соответствует' \ n', поэтому c выражения atenation, которые включают \ n (это внешние кавычки), не будут сопоставляться. – 1010

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