删除字符串中连续的重复单词

Removing consecutive duplicate words in a string

我正在尝试编写一个函数来删除字符串中连续的重复单词。保留正则表达式找到的任何匹配项至关重要。换句话说...

A very very very dirty dog

应该变成...

A very dirty dog

我有一个似乎运行良好的正则表达式(based on this post)

(\b\S+\b)(($|\s+))+

但是我不确定如何使用 preg_replace(或者如果有更好的函数)来实现它。现在,我让它删除了所有匹配的重复单词,而没有完整保留该单词的一个副本。我可以解析变量或特殊指令以保持匹配吗?

我目前有这个...

$string=preg_replace('/(\b\S+\b)(($|\s+))+/', '', $string);

您可以使用像 \b(\S+)(?:\s+\b)+ 这样的正则表达式并替换为 </code>:</p> <pre><code>$string=preg_replace('/\b(\S+)(?:\s+\b)+/i', '', $string);

regex demo

详情:

  • \b(\S+) - 第 1 组捕获一个或多个以单词边界开头的非空白符号(也许 \b(\w+) 更适合这里)
  • (?:\s+\b)+ - 1 个或多个序列:
    • \s+ - 1 个或多个空格
    • \b - 存储在第 1 组缓冲区中的值的反向引用(该值必须是一个完整的单词)

替换模式是 </code>,替换后向引用引用存储在第 1 组缓冲区中的值。</p> <p>请注意,<code>/i 不区分大小写修饰符将使 </code> 不区分大小写,而 <code>I have a dog Dog DOG 将导致 I have a dog

<?php
$text ='one one, two three, two';
$result_text = preg_replace("/\b(\w+)\s+\1\b/i", "", $text);
echo "Result Text: ".$result_text; //one, two three, two
?>

试试这个。它应该 return 一份完好无损。