如果超过三个,PHP preg会替换字符串中的重复单词

时间:2014-08-01 23:56:57

标签: php string duplicates preg-replace word

我是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中执行此操作?

提前致谢。

3 个答案:

答案 0 :(得分:2)

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

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

$str = preg_replace($pattern, $replacement, $str);

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

online demo

答案 1 :(得分: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);

答案 2 :(得分:0)

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

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

然后你可以这样说:

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

此时,$ i将告诉您$ wordToCheck在字符串开头出现的次数。在此之后,PHP的array_shift将从数组的前面删除元素,并且在您移出足够的单词后只留下两个,implode函数将转为数组返回一个字符串。

编辑添加:我没有使用正则表达式;我不知道该怎么做,我确定你不需要。

再次编辑:这已经过测试,即使第一个"字#34;字符串不是$ 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;
?>