我尝试preg_replace
尝试使用SELECT
替换FROM
和COUNT(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)
我是一个正则表达式的菜鸟,我确定我错过了一些简单的东西。谢谢!
答案 0 :(得分:2)
你根本不能在单词类[]
中放置单词,甚至试图否定它们。您可以使用正面观察和负面预测的组合来完成此操作。
$count_sql = preg_replace('/(?<=SELECT)((?!FROM).)*/',' COUNT(id) ', $sql);
甚至是积极向后看和积极前瞻
的组合$count_sql = preg_replace('/(?<=SELECT).*?(?=FROM)/',' COUNT(id) ', $sql);
或者你可以通过捕捉SELECT
和FROM
并替换它们之间的所有内容来实现简单的路线。
$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);
编辑:由于您丢弃旧文本,因此无需在括号中捕获它。