关于正则表达式:仅使用PHP的mb_ereg_replace替换第一个匹配元素

Only replace first matching element using PHP's mb_ereg_replace

我只想替换字符串中的第一个匹配元素,而不是替换字符串中的每个匹配元素

1
2
3
4
$str = 'abc abc abc';
$find = 'abc';
$replace = 'def';
echo mb_ereg_replace( $find, $replace, $str );

这将返回" def def def"。

我需要在$ find或$ replace参数中进行什么更改才能使其返回" def abc abc"?


不太优雅,但您可以尝试

1
2
$find = 'abc(.*)';
$replace = 'def\\\\1';

请注意,如果$find包含更多捕获组,则需要调整$replace。 同样,这将替换每行中的第一个abc。 如果您的输入包含多行,请使用[\\d\\D]而不是.


您可以为" abc"做一个mb_strpos(),然后做mb_substr()

例如

1
2
3
4
5
$str = 'blah abc abc blah abc';
$find = 'abc';
$replace = 'def';
$m  = mb_strpos($str,$find);
$newstring = mb_substr($str,$m,3) ."$replace" . mb_substr($str,$m+3);


除非您需要替换正则表达式,否则最好使用普通的str_replace,它以$count作为第四个参数:

1
$str = str_replace($find, $replace, $str, $count);