2017-03-04 155 views
3

我正在嘗試編寫一個函數來刪除字符串中連續的重複單詞。正則表達式找到的任何匹配都是至關重要的。換句話說...刪除字符串中的連續重複單詞

一個非常非常非常髒狗

應該成爲...

一個非常骯髒的狗

我有一個正則表達式這似乎工作得很好(based on this post

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

但是,我不知道如何使用preg_replace(或者如果有更好的功能)來實現這一點。現在我已經刪除了所有匹配的重複單詞,而不留下單詞的完整副本。我可以解析變量或特殊指令來保持匹配嗎?

我有這個目前...

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

請注意,在交替中使用'$'是沒有意義的,因爲'$ \ 1'永遠不會匹配(您甚至不使用多行修飾符 –

回答

3

您可以使用正則表達式像\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個或多個序列: - 1
    • \s+或多個空格
    • \1\b - 反向引用存儲在組值1個緩衝液(該值必須是一個全字)

替換模式是$1,替換反向引用是指存儲在組1緩衝區中的值。

請注意,/i不區分大小寫的修飾符會使得\1不區分大小寫,而I have a dog Dog DOG會導致I have a dog

+0

謝謝Wiktor!爲了澄清,我以前的表達式還捕獲單詞不同的情況,所以這可能對某些人有用並值得投入記錄。 – AdamJones

+0

我相信我的原始正則表達式可以處理不同的包含單詞的單詞。所以「非常非常」也會被捕獲 – AdamJones

+0

啊好吧......我只是嘗試了工作演示,並且似乎沒有這樣做 – AdamJones

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

試試這個。它應該完整地返回一個副本。

+0

這是我的解決方案的輕量級版本,沒有超過1個重複的單詞支持。 –