PHP替换多行字符串中最后出现的单词

PHP替换多行字符串中最后出现的单词,php,regex,Php,Regex,我试图替换多行SQL语句中的最后一个FROM 下面是一个最接近这个解决方案的例子 $str = "SELECT *, (SELECT COUNT(company.id) FROM company WHERE 1 = 4) as calc_field FROM company WHERE id = '09401293481-23-12'"; //preg_match("/(FROM (?!.*FROM))/m", $str, $matches); //pri

我试图替换多行SQL语句中的最后一个FROM

下面是一个最接近这个解决方案的例子

$str = "SELECT *, 
    (SELECT COUNT(company.id) FROM company WHERE 1 = 4) as calc_field
        FROM company 
    WHERE id = '09401293481-23-12'";


//preg_match("/(FROM (?!.*FROM))/m", $str, $matches);
//print_r($matches);
$str = preg_replace("/(FROM (?!.*FROM))/m", " REPLACEDFROM ", $str);

echo  $str;
echo "\n\n";
然而,这是行不通的。仅当字符串/查询只有一行(没有换行符)时,它才起作用。我得到的输出如下

SELECT *,
(SELECT COUNT(company.id)  REPLACEDFROM company WHERE 1 = 4) as calc_field
REPLACEDFROM company
WHERE id = '09401293481-23-12'
然而,我应该得到的输出,或者我想要得到的输出,如下所示

SELECT *,
(SELECT COUNT(company.id) FROM company WHERE 1 = 4) as calc_field
REPLACEDFROM company
WHERE id = '09401293481-23-12'
如何修改正则表达式以获得所需的结果

谢谢

$str = preg_replace("/(\\bFROM\\b(?![\\s\\S]*\\bFROM\\b))/m", " REPLACEDFROM ", $str);
更改为
[\s\s]
以匹配
换行符
以及
默认值不会这样做。请参阅演示


最简单的方法是使用贪婪和\K构造。
除了是最简单的方法外,它也是最快的方法
这是可以做到的。有些人不在乎表现


只需使用
(?s)。*\K\b从\b

这同样有效。不过,我不太明白它到底在做什么。我会研究的。非常感谢。