PHP preg_replace 非贪心麻烦
我一直在使用以下网站来测试 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
我认为?是非贪婪修饰符。这是怎么回事?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您的非贪婪修饰符正在按预期工作。但是
preg_match
会将所有出现的(非贪婪)匹配替换为替换文本(在您的情况下是""
)。如果您只想替换第一个,可以将1
作为可选的第四个参数(限制)传递给preg_replace
函数 (preg_replace 的 PHP 文档)。在您链接的网站上,可以通过在单词“Flags”和单词“limit”之间的文本输入中键入1
来完成此操作。Your non-greedy modifier is working as expected. But
preg_match
replaces all occurences of the the (non-greedy) match with the replacement text (""
in your case). If you want only the first one replaced, you could pass1
as the optional 4th argument (limit) topreg_replace
function (PHP docs for preg_replace). On the website you linked, this can be accomplished by typing1
into the text input between the word "Flags" and the word "limit".只是@Asaph 解决方案的一个实际示例。在此示例中,您不需要非贪婪,因为您可以指定计数。
仅用标记替换行中第一次出现的 @
just an actual example of @Asaph solution. In this example ou don't need non-greediness because you can specify a count.
replace just the first occurrence of @ in a line with a marker