2014-10-21 3 views
0

Я хочу иметь регулярное выражение, которое соответствует всем между первым SELECT и последним FROM в инструкции SQL с PHP. Для того, чтобы поставить это в качестве примера:preg_match все между первым SELECT и последним FROM

SELECT 
    `t1`.`id`, 
    `t1`.`created`, 
    (
     SELECT 
      `t2`.`content` 
     FROM 
      `table2` `t2` 
     WHERE 
      `t1`.`id` = `t2`.`id` 
    ) `sub` 
FROM 
    `table1` `t1` 

В заявлении выше заявление я хочу, чтобы соответствовать:

`t1`.`id`, 
    `t1`.`created`, 
    (
     SELECT 
      `t2`.`content` 
     FROM 
      `table2` `t2` 
     WHERE 
      `t1`.`id` = `t2`.`id` 
    ) `sub` 

Я пытался делать это сам, но я не могу заставить его работать должным образом.

ответ

1
(?<=SELECT\s)(.*)(?=\sFROM) 

Try this.Grab capture.See demo.

http://regex101.com/r/rQ6mK9/15

+0

Спасибо, почти работает Я хочу этого. Я просто столкнулся с другой проблемой с этим запросом: http://regex101.com/r/lD8uH4/1. Это происходит неправильно, когда я добавляю другой оператор select из предложения where. – SheperdOfFire

+0

@ FIA2008 http://regex101.com/r/lD8uH4/2 – vks

+0

Спасибо за помощь! – SheperdOfFire

1

модификатор Используйте DOTALL, чтобы точка, чтобы соответствовать даже символы новой строки также. \K в следующем регулярном выражении отменит предыдущие совпадающие символы от печати.

(?s)SELECT[^\n]*\n\K.*(?=[^\n]*FROM) 

ИЛИ

(?s)SELECT[^\n]*\n\K.*(?=\n[^\n]*?FROM) 

DEMO

2

Вы можете использовать базовые регулярные выражения для достижения этой цели ...

preg_match('~SELECT(.*)FROM~si', $text, $match); 
echo $match[1]; 

Code Demo

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