Php preg_替换和剩余的字符串
我正在尝试执行一个Php preg_替换和剩余的字符串,php,regex,Php,Regex,我正在尝试执行一个preg\u replace以将选择和中的替换为计数(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 animal
preg\u replace
以将选择和中的替换为计数(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)
我是regex noob,我肯定我错过了一些简单的东西。谢谢大家! 您根本无法将单词放在字符类[]
中,甚至尝试否定它们。您可以结合使用正向前瞻和负向前瞻来实现这一点
$count_sql = preg_replace('/(?<=SELECT)((?!FROM).)*/',' COUNT(id) ', $sql);
有关这些正则表达式如何工作的解释,请访问并输入它们。您根本无法将单词放入字符类[]
中,甚至尝试对其进行否定。您可以结合使用正向前瞻和负向前瞻来实现这一点
$count_sql = preg_replace('/(?<=SELECT)((?!FROM).)*/',' COUNT(id) ', $sql);
有关这些正则表达式如何工作的解释,请访问并输入它们。您根本无法将单词放入字符类[]
中,甚至尝试对其进行否定。您可以结合使用正向前瞻和负向前瞻来实现这一点
$count_sql = preg_replace('/(?<=SELECT)((?!FROM).)*/',' COUNT(id) ', $sql);
有关这些正则表达式如何工作的解释,请访问并输入它们。您根本无法将单词放入字符类[]
中,甚至尝试对其进行否定。您可以结合使用正向前瞻和负向前瞻来实现这一点
$count_sql = preg_replace('/(?<=SELECT)((?!FROM).)*/',' COUNT(id) ', $sql);
有关这些正则表达式如何工作的解释,请访问并输入它们。与其使正则表达式复杂化以包含负匹配,不如在替换中包含未更改的部分:
$count_sql = preg_replace("/(SELECT ).*( FROM)/","$1COUNT(id)$2",$sql);
或者更简单:
$count_sql = preg_replace("/SELECT .* FROM/","SELECT COUNT(id) FROM",$sql);
编辑:因为您要丢弃旧文本,所以不需要将其捕获到括号中。与其使正则表达式复杂化以包含负匹配,不如在替换中包含未更改的部分:
$count_sql = preg_replace("/(SELECT ).*( FROM)/","$1COUNT(id)$2",$sql);
或者更简单:
$count_sql = preg_replace("/SELECT .* FROM/","SELECT COUNT(id) FROM",$sql);
编辑:因为您要丢弃旧文本,所以不需要将其捕获到括号中。与其使正则表达式复杂化以包含负匹配,不如在替换中包含未更改的部分:
$count_sql = preg_replace("/(SELECT ).*( FROM)/","$1COUNT(id)$2",$sql);
或者更简单:
$count_sql = preg_replace("/SELECT .* FROM/","SELECT COUNT(id) FROM",$sql);
编辑:因为您要丢弃旧文本,所以不需要将其捕获到括号中。与其使正则表达式复杂化以包含负匹配,不如在替换中包含未更改的部分:
$count_sql = preg_replace("/(SELECT ).*( FROM)/","$1COUNT(id)$2",$sql);
或者更简单:
$count_sql = preg_replace("/SELECT .* FROM/","SELECT COUNT(id) FROM",$sql);
编辑:既然你扔掉了旧文本,你就不需要把它放在括号里。你说的[^SELECT]
和[^FROM]
是什么意思?我正试图用计数(id)
替换选择和之间的所有内容[^FROM]
要做什么?我试图用COUNT(id)
替换SELECT
和FROM
之间的所有内容。你是什么意思[^SELECT]
和[^FROM]
要做什么?我试图用COUNT(id)
替换SELECT
和FROM
之间的所有内容[^SELECT]
和[^FROM]
要做什么?我正在尝试将选择
和FROM
之间的所有内容替换为计数(id)
太棒了,这正是我想要的!它们都做相同的事情吗?一种解决方案比另一种解决方案有优势吗?更新了答案,带有正则表达式解释的链接。谢谢,我将它们输入到了你的链接中,对于第二种解决方案,我不明白为什么它在从
找到后不停止…如果是easy解释我会很感激的,否则谢谢你的时间!你可以使用s
修饰符使点匹配换行符也很棒,这正是我想要的!它们都做相同的事情吗?一个解决方案比另一个有优势吗?更新的答案,带有正则表达式解释的链接。谢谢,我将它们输入到您的链接中,对于第二个解决方案,我不明白为什么它在从
中找到后不停止…如果很容易解释,我将不胜感激,否则已经感谢您的时间!您可以使用s
修改器使点匹配换行符,这正是我想要的!请执行以下操作你们都做了同样的事情吗?一个解决方案比另一个有优势吗?更新了答案,带有正则表达式解释的链接。谢谢,我将它们输入到了你的链接中,对于第二个解决方案,我不明白为什么在它从
中找到后它不停止…如果很容易解释,我将不胜感激,否则谢谢你的时间已经到了!你可以使用s
修饰符使点匹配换行符也很棒,这正是我想要的!它们都做相同的事情吗?一种解决方案比另一种解决方案有优势吗?更新了答案,带有正则表达式解释的链接。谢谢,我将它们输入到了你的链接中,第二个是s解决方案我不明白为什么它在从
中找到后不停止…如果易于解释,我将不胜感激,否则已经感谢您的时间!您可以使用s
修改器,使点与换行符匹配