PHP preg_replace non-greedy trouble

2019-06-18 16:23发布

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?

2条回答
霸刀☆藐视天下
2楼-- · 2019-06-18 16:34

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".

查看更多
ら.Afraid
3楼-- · 2019-06-18 16:41

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);
查看更多
登录 后发表回答