preg_replace和字符串的剩余部分

时间:2014-05-03 16:02:32

标签: php regex

我尝试preg_replace尝试使用SELECT替换FROMCOUNT(id)之间的所有内容,如下所示:

$sql = 'SELECT DISTINCT dogs,cats,birds,id FROM animals WHERE claws="no"';

$count_sql = preg_replace("/[^SELECT ](.*)[^ FROM]/","COUNT(id)",$sql);

echo $count_sql;

我想要的是:

SELECT COUNT(id) FROM animals WHERE claws="no"

但我得到的是:

SELECT COUNT(id)

我是一个正则表达式的菜鸟,我确定我错过了一些简单的东西。谢谢!

2 个答案:

答案 0 :(得分:2)

你根本不能在单词类[]中放置单词,甚至试图否定它们。您可以使用正面观察负面预测的组合来完成此操作。

$count_sql = preg_replace('/(?<=SELECT)((?!FROM).)*/',' COUNT(id) ', $sql);

甚至是积极向后看积极前瞻

的组合
$count_sql = preg_replace('/(?<=SELECT).*?(?=FROM)/',' COUNT(id) ', $sql);

或者你可以通过捕捉SELECTFROM并替换它们之间的所有内容来实现简单的路线。

$count_sql = preg_replace('/(SELECT).*?(FROM)/','$1 COUNT(id) $2', $sql);

有关这些正则表达式如何工作的说明,请访问Explain Regular Expression并输入它们。

答案 1 :(得分:1)

不要使正则表达式复杂化以包含否定匹配,只需在替换中包含未更改的部分:

 $count_sql = preg_replace("/(SELECT ).*( FROM)/","$1COUNT(id)$2",$sql);

甚至更简单:

 $count_sql = preg_replace("/SELECT .* FROM/","SELECT COUNT(id) FROM",$sql);

编辑:由于您丢弃旧文本,因此无需在括号中捕获它。