我在一个相当大的文件上使用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'的正确方法是什么?
答案 0 :(得分:3)
使用\K
:重置报告的匹配的起点。任何先前消费的字符不再包含在最终匹配中
$pattern = '/http:\/\/www\.example\.com\/\?foo=1\&bar=\K\d+/';
preg_replace($pattern, "4", $content);
你也可以使用lookbehind:
$pattern = '/(?<=http:\/\/www\.example\.com\/\?foo=1\&bar=)\d+/';
preg_replace($pattern, "4", $content);
答案 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);