我正在尝试编写一个删除字符串中连续重复单词的函数。正则表达式发现的任何匹配都至关重要。换句话说......
一只非常非常脏的狗
应该成为......
非常脏的狗
我有一个似乎运作良好的正则表达式(based on this post)
(\b\S+\b)(($|\s+)\1)+
但是我不确定如何使用preg_replace(或者如果有更好的功能)来实现它。现在我删除所有匹配的重复单词而不留下完整单词的一个副本。我可以解析变量或特殊指令以保持匹配吗?
我目前有这个......
$string=preg_replace('/(\b\S+\b)(($|\s+)\1)+/', '', $string);
答案 0 :(得分:4)
您可以使用\b(\S+)(?:\s+\1\b)+
之类的正则表达式替换为$1
:
$string=preg_replace('/\b(\S+)(?:\s+\1\b)+/i', '$1', $string);
请参阅regex demo
<强>详情:
\b(\S+)
- 第1组捕获一个或多个前面带有单词边界的非空白符号(也许\b(\w+)
会更适合这里)(?:\s+\1\b)+
- 1个或多个序列:
\s+
- 一个或多个空格\1\b
- 对存储在第1组缓冲区中的值的反向引用(值必须是整个单词)替换模式为$1
,替换后向引用引用存储在第1组缓冲区中的值。
请注意,/i
不区分大小写的修饰符会使\1
不区分大小写,I have a dog Dog DOG
会导致I have a dog
。
答案 1 :(得分:0)
<?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
?>
试试这个。它应该完好无损地返回一份。