Php 使用正则表达式在字符串中最后一次出现后获取

Php 使用正则表达式在字符串中最后一次出现后获取,php,regex,Php,Regex,我有一个SQL字符串,需要从主“from”值获取表名。我需要找到最后一个“FROM”事件,它可能有也可能没有附加约束。以下是字符串的几种显示方式: $input = "SELECT title, (SELECT name FROM Contact WHERE name = 'foo') as name FROM Account WHERE title = 'president'"; $input = "SELECT title, (SELECT name FROM Contact WHERE n

我有一个SQL字符串,需要从主“from”值获取表名。我需要找到最后一个“FROM”事件,它可能有也可能没有附加约束。以下是字符串的几种显示方式:

$input = "SELECT title, (SELECT name FROM Contact WHERE name = 'foo') as name FROM Account WHERE title = 'president'";
$input = "SELECT title, (SELECT name FROM Contact WHERE name = 'foo') as name FROM Account LIMIT 1";
$input = "SELECT title, (SELECT name FROM Contact WHERE name = 'foo') as name FROM Account OFFSET 3";
$input = "SELECT title, (SELECT name FROM Contact WHERE name = 'foo') as name FROM Account ANYTHING_HERE_REALLY";
$input = "SELECT title, (SELECT name FROM Contact WHERE name = 'foo') as name FROM Account";
所有项目的预期产出为:账户

从搜索论坛的任何游戏来看,这是我要走的方向,但我知道这是不正确的

preg_match('/.*FROM\s([^]]+)\sWHERE/', $input, $output);

首先,将正则表达式用于级联内容(如级联查询)是一种不好的做法。但是我们走了

只需在FROM之后匹配非空格序列

注:由于《哈利波特》中克莱恩之星的贪婪,它肯定会寻找最新的比赛。您的模式实际上旨在通过期望WHERE子句来过度指定问题

带有给定示例和交互式php的示例-a:


这应该适合您:

preg_match_all('/FROM\s?(\S+)/', $input, $output);
$输出:

Array
(
    [0] => Array
        (
            [0] => FROM Contact
            [1] => FROM Account
        )

    [1] => Array
        (
            [0] => Contact
            [1] => Account
        )

)

精彩的你不是唯一一个关心在查询语法中使用正则表达式的人,但它确实是为了提供信息,所以我不介意,出于某种奇怪的原因,是否什么都不返回。我很感激你仔细考虑了这个事实。这正是我在最后一个小时里想要完成的。
preg_match_all('/FROM\s?(\S+)/', $input, $output);
Array
(
    [0] => Array
        (
            [0] => FROM Contact
            [1] => FROM Account
        )

    [1] => Array
        (
            [0] => Contact
            [1] => Account
        )

)