Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php preg_替换和剩余的字符串_Php_Regex - Fatal编程技术网

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
修改器,使点与换行符匹配