PHP preg_replace非贪婪的麻烦

时间:2009-12-14 05:57:20

标签: php regex regex-greedy

我一直在使用以下网站来测试PHP正则表达式,所以我不必经常上传: http://www.spaweditor.com/scripts/regex/index.php

我正在使用以下正则表达式:

/(.*?)\.{3}/

在以下字符串上(替换为空):

Non-important data...important data...more important data

并且preg_replace正在返回:

more important data

但我希望它能够回归:

important data...more important data
我以为是?是非贪婪的修饰语。这是怎么回事?

2 个答案:

答案 0 :(得分:8)

您的非贪婪修饰符正在按预期工作。但preg_match替换所有出现的(非贪婪)匹配与替换文本(在您的情况下为"")。如果您只想替换第一个,则可以将1作为可选的第四个参数(限制)传递给preg_replace函数(PHP docs for preg_replace)。在您链接的网站上,可以通过在“标志”一词和“限制”一词之间的文本输入中键入1来完成此操作。

答案 1 :(得分:0)

只是@Asaph解决方案的一个实际示例。在这个例子中,你不需要非贪婪,因为你可以指定一个计数。 用标记

替换第一次出现的@
 $line=preg_replace('/@/','zzzzxxxzzz',$line,1);