2011-05-02 171 views
2

我清理一個字符串數組中刪除字符串:幫助str_replace()函數

$regex = array("subida", " de"," do", " da", "em", " na", " no", "blitz"); 

這是我使用的str_replace函數:

for($i=0;$i<8;$i++){ 
    $twit = str_replace($regex[$i],'', $twit); 
} 

我如何讓它只刪除一個單詞,如果它正好是字符串中的單詞,我的意思是,我有以下短語: 「#blitz na subida do alfabarra blitz」 它會返回我: 「#alfabarra」, 我不想第一個「閃電戰」被刪除,因爲它有一個哈希「#」,我希望它輸出: 「#blitz alfabarra」,可能嗎?謝謝

+2

您的變量('$ regex')的名稱,你沒有使用在所有的正則表達式是一種誤導。實際上,'str_replace'接受和數組,所以你可以做'$ twit = str_replace($ regex,'',$ twit);' – 2011-05-02 13:29:04

回答

5

這裏假定你的字符串都沒有/。如果是這樣,請以/作爲第二個參數,明確運行preg_quote()

它也假定你想匹配的話,所以我修剪每個單詞。

$words = array("subida", " de"," do", " da", "em", " na", " no", "blitz"); 

$words = array_map('trim', $words); 

$words = array_map('preg_quote', $words); 

$str = preg_replace('/\b[^#](?:' . implode('|', $words) . ')\b/', '', $str); 

Codepad

+0

真棒,非常感謝。 – 2011-05-02 13:38:42

+0

有正則表達式的輕微警告:可以刪除由於角色類而導致的「ablitz」字樣。正則表達式在這裏失敗了,所以用單詞array_diff代替。 – cmbuckley 2011-05-05 14:39:04

+0

@cbuckley嗯,你是對的。我將不得不有另一種想法:) – alex 2011-05-05 23:14:18

1

未能拿出一個包羅萬象的正則表達式的解決方案後,下面可能是有用的:

$words = array("subida", " de", " do", " da", "em", " na", " no", "blitz"); 
$words = array_map('trim', $words); 

$str = '#blitz *blitz ablitz na subida do alfabarra blitz# blitz blitza'; 

$str_words = explode(' ', $str); 
$str_words = array_diff($str_words, $words); 
$str = implode(' ', $str_words); 
var_dump($str); 

獲取一輪基於正則表達式的解決方案字邊界的併發症少。

0

試試這個:

for($i=0; $i<$regex('count'); $i++){ 
    foreach($regex[$i] as $key) { 
     if (is_string($key)) { 
      $twit = str_replace($regex[$i],'', $twit); 
     } 
    } 
}