preg_match第一个SELECT和最后一个FROM之间的所有内容

时间:2014-10-21 10:39:02

标签: php regex preg-replace preg-match

我希望有一个正则表达式,它匹配SQL语句中第一个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`

我自己尝试过这样做,但我无法正常工作。

3 个答案:

答案 0 :(得分:2)

您可以使用基本的正则表达式来实现这一目标......

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

Code Demo

答案 1 :(得分:1)

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

试试这个。抓住捕获。参见演示。

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

答案 2 :(得分:1)

使用DOTALL修饰符使点也匹配换行符。下面的正则表达式中的\K会丢弃以前匹配的字符,不会打印。

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

OR

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

DEMO