使用preg_replace仅替换第一个匹配

时间:2014-03-17 05:13:01

标签: php regex string

我正在测试phpList中的str_replace,我想替换字符串的第一个匹配项。我在其他帖子上发现如果我想替换字符串的第一个匹配,我应该使用preg_replace,问题是preg_replace由于某种原因没有返回字符串。

两个

$fp = fopen('/var/www/data.txt', 'w');
$string_test = preg_replace(basename($html_images[$i]), "cid:$cid", $this->Body,1);
fwrite($fp,$string_test);
fclose($fp);

$fp = fopen('/var/www/data.txt', 'w');
fwrite($fp,preg_replace(basename($html_images[$i]), "cid:$cid", $this->Body,1));
fclose($fp);

将空字符串写入文件。我想知道如何获取返回字符串,str_replace似乎不适用于第一次匹配。但是,str_replace将返回一个字符串。

2 个答案:

答案 0 :(得分:0)

preg_replace()' s正则表达式匹配并替换。您传递的是字符串而不是有效的RegEx作为第一个参数。

相反,您可能正在寻找替换字符串的str_replace()

答案 1 :(得分:0)

实际上,preg_replace()是错误的工具,如果您只想执行常规查找&更换操作。您可以使用strpos()substr_replace()执行单个替换:

$find = basename($html_images[$i]);
$string_test = $this->Body;
if (($pos = strpos($string_test, $find)) !== false) {
    $string_test = substr_replace($string_test, "cid:$cid", $pos, strlen($find));
}

使用preg_replace(),你会得到这样的结果:

$string_test = preg_replace('~' . preg_quote(basename($html_images[$i], '~') . '~', "cid:$cid", $this->Body, 1);

为方便起见,您可以将两个包装成一个名为str_replace_first()的函数。