使用preg_replace只替换第一个匹配

67

我有一个字符串,结构类似于:'aba aaa cba sbd dga gad aaa cbz'。由于它来自外部来源,每次字符串可能会有所不同。

我想仅替换第一次出现的'aaa',而不是所有的。这是否可能?

3个回答

132

preg_replace 的第四个可选参数是 limit

preg_replace($search, $replace, $subject, 1);

1
谢谢您的回答,如果我需要仅替换从结尾开始的第一个匹配项,应该使用什么代码? - jose sanchez
2
如果字符串不太长,您可以使用strrev将其反转,并使用此技巧但搜索要查找的模式的反向,然后再次反转字符串。如果它非常长,您将希望以相反的顺序扫描它,以避免两次反转字符串的开销。 - Paul
@josesanchez:你也可以使用贪婪量词来匹配字符串的末尾:preg_replace('~.*\Kaaa~s', $replace, $subject, 1);。请注意,对于这种情况,第四个参数是不需要的。 - Casimir et Hippolyte

14

您可以使用preg_replacelimit参数,并将其设置为1,以便最多只进行一次替换:

$new = preg_replace('/aaa/','replacement',$input,1);

1
例如,输出的$content如下:

START 
FIRST AAA 
SECOND AAA

1) 如果您使用:

$content = preg_replace('/START(.*)AAA/', 'REPLACED_STRING', $content);

它将从开头到最后一个AAA改变一切,你的结果将是:

REPLACED_STRING

2) 如果你使用:

$content = preg_replace('/START(.*?)AAA/', 'REPLACED_STRING', $content);

你的结果会像这样:
REPLACED_STRING 
SECOND AAA

为什么会发生这种情况?关于“?”。 - user111671

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接