2015-10-13 110 views
2

我试图用多行代替SQL语句中的最后一个FROM。PHP替换多行字符串中最后一次出现的字

以下是我对解决方案最接近的一个例子。

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

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

谢谢!

回答

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

变化.[\s\S]匹配newlines以及.是默认不做that.See演示。

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

+0

谢谢!我只是试过这个,它的工作原理。 –

0

这最简单的方法就是用贪婪和\ķ结构。
除了最简单的方法外,它是最快的方式,它可以完成。有些人不关心表现。

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

+0

这也适用。虽然,我不完全明白它在做什么。我会研究。谢谢!! –

相关问题