PHP替换多行字符串中Word的最后发生

时间:2015-10-13 16:09:44

标签: php regex

我正在尝试替换多行的SQL语句中的最后一个FROM。

我最接近解决方案的是下面的例子。

let add_to_list (my_list : string list) = 
  let new_list = my_list @ ["somevalue"] in
  print_list(new_list)

然而,这不起作用。它仅在字符串/查询只有一行(没有换行符)时才有效。我得到的输出如下。

$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'

如何修改正则表达式以获得所需的结果?

谢谢!

2 个答案:

答案 0 :(得分:0)

$str = preg_replace("/(\\bFROM\\b(?![\\s\\S]*\\bFROM\\b))/m", " REPLACEDFROM ", $str);

.更改为[\s\S]以匹配newlines以及.默认不会这样做。请参阅演示。

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

答案 1 :(得分:0)

这种最简单的方法是使用贪婪和\ K结构 除了是最简单的方式,它是最快的方式 可以做到。有些人不关心表现。

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

即可