删除字符串

时间:2017-03-04 22:50:23

标签: php regex preg-replace

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

  

一只非常非常脏的狗

应该成为......

  

非常脏的狗

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

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

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

我目前有这个......

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

2 个答案:

答案 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
?>

试试这个。它应该完好无损地返回一份。