【问题标题】:preg_replace to match all but first occurance of something?preg_replace 匹配除第一次出现之外的所有内容?
【发布时间】:2012-08-02 20:24:31
【问题描述】:

我正在寻找一种方法来替换除第一次出现的组或某些字符之外的所有内容。

例如以下随机字符串:

+Z1A124B555ND124AB+A555

1,5,2,4,A,B 和 + 在整个字符串中重复。

124、555 是同样重复出现的字符组。

现在,假设我要删除除第一次出现的 555、A 和 B。

什么正则表达式是合适的?我可以想到一个替换所有的例子:

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

类似 ^ 的东西,但我想保留第一次出现...有什么想法吗?

【问题讨论】:

  • 您可以在+ 拆分,对除第一个数组元素以外的所有内容运行正则表达式,然后将替换的字符串连接到单个字符串
  • 我不太明白你的想法。

标签: php regex preg-replace


【解决方案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);

【讨论】:

  • 不,事实并非如此......根本没有分隔符,这只是一个随机事件,完全随机......我将尝试编辑我的示例以使其成为更清楚一点。
  • 酷,将匹配的数量存储在 $replaced 中是个好主意,所以我想我会坚持下去!谢谢。
  • 我只是想知道,是否可以使用 $match,因为它可能会返回数组。我的 php 还抱怨代码第 4 行上的非法偏移类型。我会先尝试弄清楚 :-) 虽然是的,但它看起来绝对可行。那样/
  • 好吧,我的错。 $match 实际上是一个数组。完整的匹配存储在$match[0] 中。我会更新我的答案
  • 是的,谢谢,它现在可以工作了 ^.^ 或者...等等,它没有:D 我也在试图找出问题所在。
【解决方案2】:

可以修改此解决方案以执行您想要的操作:PHP: preg_replace (x) occurrence?

这里有一个修改后的解决方案:

<?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";
?>

【讨论】:

  • 是的,它可以工作:) 不过,这与刚刚制作的课程完全相同。还是谢谢。
【解决方案3】:

适用于所有模式的更通用的函数。

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
  );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-14
    • 2013-04-18
    • 1970-01-01
    • 2012-08-01
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多