Php 删除字符串中的连续重复字

Php 删除字符串中的连续重复字,php,regex,preg-replace,Php,Regex,Preg Replace,我正在尝试编写一个函数来删除字符串中连续的重复单词。保留正则表达式找到的任何匹配项是至关重要的。换句话说 非常脏的狗 应该成为 非常脏的狗 我有一个正则表达式,它似乎工作得很好() 但是,我不知道如何使用preg_replace(或者是否有更好的函数)来实现这一点。现在我让它删除所有匹配的重复单词,而不留下一个完整的单词副本。我可以解析变量或特殊指令来保持匹配吗 我现在有这个 $string=preg_replace('/(\b\S+\b)(($|\s+)\1)+/', '', $string)

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

非常脏的狗

应该成为

非常脏的狗

我有一个正则表达式,它似乎工作得很好()

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

我现在有这个

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

您可以使用类似于
\b(\S+(:\S+\1\b)+
的正则表达式,并替换为
$1

$string=preg_replace('/\b(\S+)(?:\s+\1\b)+/i', '$1', $string);

详细信息

  • \b(\S+)
    -组1捕获一个或多个前面带有单词边界的非空白符号(可能
    \b(\w+)
    更适合此处)
  • (?:\s++\1\b)+
    -1个或多个序列:
    • \s+
      -1个或多个空格
    • \1\b
      -对存储在组1缓冲区中的值的反向引用(该值必须是一个整字)
替换模式为
$1
,是指存储在组1缓冲区中的值的替换反向参考

请注意,
/i
不区分大小写修饰符将使
\1
不区分大小写,而
我有一只狗
将导致
我有一只狗


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

试试这个。它应该返回一份完整的副本。

谢谢Wiktor!为了澄清这一点,我之前的表达也捕捉到了不同大小写的单词。因此,这可能对一些人有用,值得记录在案。我相信我的原始正则表达式使用不同的大小写单词。所以“非常非常”也会是caughtAh ok。。。我刚刚尝试了工作演示,但它似乎没有做到这一点。非常感谢您对这个Wiktor的帮助@使用
preg_替换('/\b(\S+)(:\S+\1\b)+/u','$1','。另外,
'/\b(\p{L}+(:\s+\1\b)+/u'
也可以。请注意,在备选方案中使用
$
没有任何意义,因为
$\1
永远不会匹配(您甚至不使用多行修饰符。它是我的解决方案的轻型版本,没有超过1个重复字的支持)。
<?php
$text ='one one, two three, two';
$result_text = preg_replace("/\b(\w+)\s+\\1\b/i", "$1", $text);
echo "Result Text: ".$result_text; //one, two three, two
?>