PHP preg_replace non-greedy trouble

倾然丶 夕夏残阳落幕 提交于 2019-12-23 09:40:36

问题


I've been using the following site to test a PHP regex so I don't have to constantly upload: http://www.spaweditor.com/scripts/regex/index.php

I'm using the following regex:

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

on the following string (replacing with nothing):

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

and preg_replace is returning:

more important data

yet I expect it to return:

important data...more important data

I thought the ? is the non-greedy modifier. What's going on here?


回答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 pass 1 as the optional 4th argument (limit) to preg_replace function (PHP docs for preg_replace). On the website you linked, this can be accomplished by typing 1 into the text input between the word "Flags" and the word "limit".




回答2:


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

 $line=preg_replace('/@/','zzzzxxxzzz',$line,1);


来源:https://stackoverflow.com/questions/1899158/php-preg-replace-non-greedy-trouble

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!