67

I have a string with structure similar to: 'aba aaa cba sbd dga gad aaa cbz'. The string can be a bit different each time as it's from an external source.

I would like to replace only first occurrence of 'aaa' but not the others. Is it possible?

DreadPirateShawn
  • 8,164
  • 4
  • 49
  • 71
deadbeef
  • 673
  • 1
  • 5
  • 5

3 Answers3

130

The optional fourth parameter of preg_replace is limit:

preg_replace($search, $replace, $subject, 1);
Paul
  • 139,544
  • 27
  • 275
  • 264
  • 1
    Thanks for yor answer, if I need to replace only the first match starting from the end? what would be the code ? – jose sanchez Oct 30 '13 at 02:42
  • 2
    @josesanchez If the string isn't too long you could reverse it using strrev, and use this trick but search for the reverse of the pattern you want to find, then reverse the string again. If it is very long you'll want to scan it in reverse to avoid the overhead of reversing the string twice – Paul Oct 30 '13 at 16:50
  • @josesanchez: You can also reach the end of the string using a greedy quantifier: `preg_replace('~.*\Kaaa~s', $replace, $subject, 1);`. Note that for this case, the fourth parameter is not needed. – Casimir et Hippolyte Jun 21 '23 at 05:26
14

You can use the limit argument of preg_replace for this and set it to 1 so that at most one replacement happens:

$new = preg_replace('/aaa/','replacement',$input,1);
codaddict
  • 445,704
  • 82
  • 492
  • 529
1

for example, out $content is:

START 
FIRST AAA 
SECOND AAA

1) if you use:

$content = preg_replace('/START(.*)AAA/', 'REPLACED_STRING', $content);

it will change everything from the START to the last AAA and Your result will be:

REPLACED_STRING

2) if you use:

$content = preg_replace('/START(.*?)AAA/', 'REPLACED_STRING', $content);

Your Result will be like:

REPLACED_STRING 
SECOND AAA
T.Todua
  • 53,146
  • 19
  • 236
  • 237