preg_replace查询字符串参数

时间:2016-02-10 00:00:07

标签: php regex

我在一个相当大的文件上使用file_get_contents。在其中,我需要找到每个实例:

http://www.example.com/?foo=1&bar=3

并将其更改为:

http://www.example.com?foo=1&bar=4

我的问题是不明白preg_replace如何只替换我的正则表达式的部分匹配而不是整个字符串。例如,伪代码如下所示:

 $content = file_get_contents($filename);
 $pattern = '/http:\/\/www\.example\.com/\?foo=1\&bar=(\d+)';
 preg_replace($pattern, "4", $content);
 file_put_contents($filename, $content);

我几乎肯定preg_replace($pattern, "4", $content);在这种情况下是错误的。用'4'替换'3'的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

使用\K:重置报告的匹配的起点。任何先前消费的字符不再包含在最终匹配中

$pattern = '/http:\/\/www\.example\.com\/\?foo=1\&bar=\K\d+/';
preg_replace($pattern, "4", $content);

DEMO

你也可以使用lookbehind:

$pattern = '/(?<=http:\/\/www\.example\.com\/\?foo=1\&bar=)\d+/';
preg_replace($pattern, "4", $content);

DEMO

答案 1 :(得分:0)

$content = file_get_contents($filename);
$pattern = '/http:\/\/www\.example\.com\/\?foo=1\&bar=(\d+)/i';
$content = preg_replace($pattern, "http://www.example.com/?foo=1&bar=4", $content);
file_put_contents($filename, $content);