preg_replace匹配所有但第一次出现的东西?

I'm looking for a way to replace all but first occurrences of a group or some character.

For example a following random string:

+Z1A124B555ND124AB+A555

1,5,2,4,A,B and + are repeating through out the string.

124, 555 are groups of characters that are also reoccurring.

Now, let's say I want to remove every but first occurrence of 555, A and B.

What regex would be appropriate? I could think of an example replacing all:

preg_replace('/555|A|B/','',$string);

Something like ^ that, but I want to keep the first occurrence... Any ideas?

Are your strings always delimited by plus signs? Do 555, A, and B always occur in the first "group" (delimited by +)?

If so, you can split, replace and then join:

$input = '+Z1A124B555+A124AB+A555';
$array = explode('+', $input, 3); // max 3 elements
$array[2] = str_replace(array('555', 'A', 'B'), '', $array[2]);
$output = implode('+', $array);

ps. No need to use regexes, when we can use a simple str_replace


Use the preg_replace_callback function:

$replaced = array('555' => 0, 'A' => 0, 'B' => 0);
$input = '+Z1A124B555+A124AB+A555';
$output = preg_replace_callback('/555|[AB]/', function($matches) {
  static $replaced = 0;
  if($replaced++ == 0) return $matches[0];
  return '';
}, $input);

This solution could be modified to do what you want: PHP: preg_replace (x) occurence?

Here is a modified solution for you:

<?php
class Parser {

    private $i;

    public function parse($source) {
        $this->i=array();
        return preg_replace_callback('/555|A|B/', array($this, 'on_match'), $source);
    }

    private function on_match($m) {
        $first=$m[0];
        if(!isset($this->i[$first]))
        {
            echo "I'm HERE";
            $this->i[$first]=1;
        }
        else
        {

            $this->i[$first]++;
        }



        // Return what you want the replacement to be.
        if($this->i[$first]>1)
        {
            $result="";
        }
        else
        {
            $result=$m[0];
        }
        return $result;
    }
}

$sample = '+Z1A124B555ND124AB+A555';
$parse = new Parser();
$result = $parse->parse($sample);
echo "Result is: [$result]
";
?>

Best of luck! God Bless!

A more generic function that works with every pattern.

function replaceAllButFirst($pattern, $replacement, $subject) {

  return preg_replace_callback($pattern,

    function($matches) use ($replacement, $subject) {
      static $s;
      $s++;
      return ($s <= 1) ? $matches[0] : $replacement;
    },

    $subject
  );
}