0

グループまたは一部のキャラクターの最初の出現を除くすべてを置き換える方法を探しています。

たとえば、次のランダムな文字列:

+Z1A124B555ND124AB+A555

1、5、2、4、A、B、および + が文字列全体で繰り返されます。

124、555 も再発している文字のグループです。

ここで、555、A、B の最初の出現を除くすべてを削除したいとします。

どの正規表現が適切でしょうか? すべてを置き換える例を考えることができます:

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

^ そのようなものですが、最初の出現を維持したいのですが... 何かアイデアはありますか?

4

3 に答える 3

1

このソリューションは、必要に応じて変更できます: PHP: preg_replace (x) occured?

これがあなたのための修正された解決策です:

<?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]\n";
?>
于 2012-08-02T21:11:36.673 に答える
1

文字列は常にプラス記号で区切られていますか? 555、A、および B は常に最初の「グループ」(+ で区切られている) に含まれますか?

その場合は、分割、置換、および結合できます。

$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。単純な str_replace を使用できる場合、正規表現を使用する必要はありません


preg_replace_callback関数を使用します。

$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);
于 2012-08-02T20:35:43.570 に答える
0

すべてのパターンで機能する、より一般的な関数。

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
  );
}
于 2016-01-15T23:43:12.503 に答える