Skip to content
Advertisement

PHP preg_replace non-greedy trouble

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?

Advertisement

Answer

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

User contributions licensed under: CC BY-SA
8 People found this is helpful
Advertisement