2013-08-06 101 views
1

哦,這個男孩這是一個奇怪的。那麼我有一個數組與密鑰值的圖像數組。帶限制參數的str_replace

$smiles = array(':)' => 'http://www.example.com/happy.png', ':(' => 'http://www.example.com/sad.png'); 

,然後我有一個文本輸入:that's sad to hear :(, but also great that you go a new dog :)

我可以分析整個陣列,通過str_replace函數代替,但我想每個消息4個表情符號的限制。

我的舊(無限制):

function addSmilies($text){ 
    global $smilies; 

    foreach($smilies as $key => $val) 
    { 
     $search[] = $key; 
     $replace[] = '<img src="' . $val . '" alt="' . $key . '" />'; 
    } 

    $text = str_replace($search, $replace, $text); 
    return $text; 
} 

我知道你可以使用的preg_replace,而且有一個限制,但我可怕與正則表達式,不能讓他們做我想做的。所以回到我的問題。是否有一個str_replace與數組的限制,或者我應該堅持preg_replace?

更新:我想過剝離:)和:(第一之前,我更換實際標記

function addSmilies($text){ 
    global $smilies; 

    foreach($smilies as $key => $val) 
    { 
     $search[] = $key; 
     $replace[] = '<img src="' . $val . '" alt="' . $key . '" />'; 
    } 

    $limit = 4; 
    $n = 1; 

    for($i=0; $i<count($search); $i++) 
    { 
     if($n >= $limit) 
      break; 

     if(strpos($text, $search[$i]) === false) 
      continue; 

     $tis = substr_count($text , $search[$i]); //times in string 
     $isOver = ($n + $tis > $limit) ? true : false; 
     $count = $isOver ? ($limit - $n) : $tis; 

     $f = 0; 
     while (($offset = strpos($text, $search[$i])) !== false) 
     { 
      if($f > $count) 
       $text = substr_replace($text, "", $offset, strlen($search[$i])); 
      $f++; 
     } 

     $n += $tis; 
    } 

    $text = str_replace($search, $replace, $text); 

    return $text; 
} 

但現在沒有圖像會不惜一切!?

+1

'str_replace()'有第四個參數叫'&$ count'。有什麼阻止你使用這個參數? Ref .: http://www.php.net/manual/en/function.str-replace.php – Bjoern

+0

@Bjoern剛剛介紹過嗎? – MysteryDev

+3

'$ count'參數返回字符串被替換的次數,它不是您可以設置的限制。 – ironcito

回答

1

顯示這裏有一個稍微乾淨。函數使用preg_split,它包含一個限制參數(因爲子集的性質,您必須添加1)基本上,您使用正則表達式分割字符串,確定導致字符串拆分的模式,然後替換前四個模式同時將字符串連接在一起,這樣會產生更清潔的功能

function addSmilies($text){ 
    $smilies = array(':)' => 'http://www.site.com/happy.png', ':(' => 'http://www.site.com/sad.png'); 

    foreach($smilies as $key => $val) 
    { 
     $search[] = $key; 
     $replace[] = '<img src="' . $val . '" alt="' . $key . '" />'; 
    } 

    $limit = 4; //Number of keys to replace 
    $return = preg_split('/(\:\)|\:\()/',$text,$limit+1,PREG_SPLIT_DELIM_CAPTURE); 

    //Concat string back together 
    $newstring = ""; 
    foreach($return as $piece) { 
     //Add more if statements if you need more keys 
     if(strcmp($piece,$search[0])==0) { 
      $piece = $replace[0]; 
     } 
     if(strcmp($piece,$search[1])==0) { 
      $piece = $replace[1]; 
     } 
     $newstring = $newstring . $piece; 
    } 
    return $newstring; 
} 
+0

謝謝,我想我可能會爆炸,implode和array_count或什麼..這個答案是非常好,更乾淨。謝謝! – MysteryDev