【问题标题】:PHP preg replace duplicate words in string if more than three如果超过三个,PHP preg 替换字符串中的重复单词
【发布时间】:2014-09-25 06:03:39
【问题描述】:

我是 PHP 新手。如果超过三成二,我想用特定的重复单词替换一个字符串,如下所示?

$wordToCheck = "abc";
$string = "abc abc abc abc Hello World abc abc abc My name is abc" 

结果将是:

$outString = "abc abc Hello World abc abc My name is abc"

我如何在 PHP 中做到这一点?

提前致谢。

【问题讨论】:

    标签: php string duplicates preg-replace word


    【解决方案1】:

    您可以使用以下模式替换超过 2 个连续的相同单词,该模式使用对捕获组 1 的反向引用(即\1

    $pattern = '~\b(\w+) \1 \K\1(?: \1)*\b ?~';
    $replacement = '';
    
    $str = preg_replace($pattern, $replacement, $str);
    

    请注意,由于\K 会从匹配结果中删除左侧已匹配的所有内容,因此不会替换最先出现的两个。

    online demo

    【讨论】:

      【解决方案2】:
      $string = "abc abc abc abc Hello World abc abc abc My name is abc";
      print preg_replace("/abc abc abc( abc)*/","abc abc",$string);
      

      【讨论】:

      • +1 这是一个很好的方法,和我的没有什么不同,但它只适用于“abc”这个词
      【解决方案3】:

      你可以像这样使用 PHP 的爆炸: $wordArray = explode ( " ", $string);

      $wordArray 现在将为原始字符串中的每个空格分隔的单词包含一个元素。

      你可以这样说:

      $i = 0;
      while ($wordArray[$i] == $wordToCheck) {
          $i++;
      }
      

      此时,$i 将告诉您在字符串的开头出现了多少次 $wordToCheck。之后,PHP 的array_shift 将删除数组前面的元素,并且,在您移出足够多的字以仅留下两个之后,implode 函数会将数组转回字符串。

      编辑补充:我没用过正则表达式;我不知道该怎么做,我确定你不需要。

      再次编辑:这已经过测试,即使字符串的第一个“单词”不是 $wordToCheck 也可以工作:

      <?php
      $wordToCheck = "abc";
      $string = "abc abc abc abc Hello World abc abc abc My name is abc";
      $wordArray = explode ( " ", $string);
      $i = 0;
      while ($wordArray[$i] == $wordToCheck) {
          $i++;
      }
      for ($j=0; $j < $i-2; $j++) {
         array_shift($wordArray);
      }
      $string = implode(" ",$wordArray);
      echo $string;
      ?>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-20
        • 2018-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多