繁体   English   中英

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

[英]PHP Replace Last Occurence of a Word in a Multi-Line String

我试图替换多行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]以匹配newlines以及. 默认情况下不会这样做。请参阅演示。

https://regex101.com/r/mG8kZ9/11

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

只需使用(?s).*\\K\\bFROM\\b

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM