2013-03-08 115 views
3

如何使用preg_replace()將字符串從'aabbaacc'替換爲'abc'?php正則表達式如何刪除重複的字符並使每個字符在字符串中唯一

目前,我的代碼使用str_split(),然後array_unique(),然後implode()。 我認爲preg_replace()也可以做到這一點,但我不知道如何。

謝謝你的幫助。

+0

FWIW,我喜歡你的方法。 – 2013-03-08 13:50:33

+2

可能的複製:http://stackoverflow.com/questions/6723389/remove-repeating-character – 2013-03-08 13:56:43

+0

@NickFury其實,現在我想到了這一點,該正則表達式只會按順序重複複製。如果它們稍後出現在字符串中,則不是。因此,我相信''aabbaacc''會變成'abac'而不是'abc'。 – 2013-03-08 13:58:51

回答

1

一個似乎適用於我的正則表達式是/(.)(?=.*?\1)/。請測試它自己的位置:

http://regexpal.com/

我也有preg_replace('/(.)(?=.*?\1)/', '', 'aaabbbabc')返回預期abc進行了測試。

希望這會有所幫助:)

+0

謝謝,它的作品。反向引用和貪婪 – user995789 2013-03-08 14:37:46

+0

是否可以保持字符的顯示順序? 使用提供的正則表達式:'bbbaaacccabc' =>'abc' 如果我想'bac'會怎麼樣? – cooltea 2013-03-08 15:06:29

+1

在這裏找到了我的問題的答案:http://stackoverflow.com/a/2583005/618156 – cooltea 2013-03-08 15:10:38

0

試試這個

$string = 'dbbaabbbaac'; 

$new = preg_replace_callback(array("/(.)\\1+/"),function($M){print_r($M);return $M[1];}, $string ); 
$new = preg_replace_callback(array('/(.)(.?\\1)/i','/(.)(.*?\\1)/i'),function($M){return $M[1].trim($M[2],$M[1]);}, $new ); 
echo $new."\n"; 

輸出

dbac 

或該帶出正則表達式

$value="aabbaacc"; 
for($i=0;$i<strlen($value);$i++){ 
    $out[$value[$i]]=$value[$i]; 
} 
echo implode("",$out); 

輸出:

abc 
+2

'$ out'應聲明爲數組 – 2013-03-08 14:00:10

+0

@ColinMorelli不需要聲明爲數組,PHP支持此語法 – 2013-03-08 14:03:08

+1

僅僅因爲PHP支持它,並不意味着您應該這樣做。 PHP也支持'eval' – 2013-03-08 14:08:41

0

這是我得到的最接近的。然而,它基本上副本: How do I remove duplicate characters and keep the unique one only in Perl?

<?php 
    $string = 'aabbaacc'; 

    $new = preg_replace('/(.)(?=.*?\1)/i','', $string ); 

    echo $new; 
?> 

不幸的是,它不保留在字符串中的順序相同。我不知道這對你是否重要。

+0

謝謝,它的工作原理,如果我的問題是重複的,請關閉它。 – user995789 2013-03-08 14:38:29

相關問題