2016-03-07 87 views
0

我有函數將取代字符串前。 :微笑:帶有圖片標籤。跳過preg_replace,如果匹配字符串不在數組中

function out_emoj($str) 
{ 

    $emoj_array = array(
     "cry", "grimacing", "joy","smiley","innocent", "wink", "flushed", "slight_smile", 
     "stuck_out_tongue_winking_eye", "relaxed", "crab","cat","expressionless", "pig", "rose", "cherry_blossom", 
     "sunny", "cloud_snow", "coffee","tea","grin", "ring", "crown", "nerd", 
     "heart_eyes", "kissing_heart", "sunglasses","scream","rage","disappointed","fearful","confused", 
     "dizzy_face", "zipper_mouth", "thermometer_face","sleeping","ghost","smiley_cat","smile_cat","joy_cat", 
     "heart_eyes_cat", "smirk_cat", "kissing_cat","scream_cat","crying_cat_face","pouting_cat","thumbsup","thumbsdown", 
     "angel", "dancer", "kimono","heart","purple_heart","sparkling_heart","heart_decoration","snowflake", 
     ); 

    return preg_replace("/:(.*?):/", " <img width='22' src='".base_url('assets/img/emojiones/$1.png')."' alt='$1'> ", $str); 

} 

我想檢查匹配字符串是否在數組中,然後替換其他跳過。 例如:如果用戶輸入:notfound:函數將添加標籤與圖像不存在。我想先檢查「notfound」是否在數組中。

+0

看看:'preg_replace_callback()' – Rizier123

+1

爲什麼不使用簡單的循環?在這種情況下,Pregmatch總是矯枉過正。 – cpugourou

回答

1

王子Actarus,您可以添加preg_replace_callback您golgot武器:

return preg_replace_callback("/:(.*?):/", function ($m) use ($emoj_array) { 
    if (in_array($m[1], $emoj_array)) 
     return ' <img width="22" src="' . base_url('assets/img/emojiones/' . $m[1] . '.png') . '" alt="' . $m[1] . '"> '; 
    return $m[0]; 
}, $str); 

另一種方式是由建模式的陣列映射你原來的數組,並使用preg_replace,但它的效率不高,因爲你的字符串會每個模式解析一次。


其他辦法:建立一個交替:

$pattern = '/:(' . implode('|', $emoj_array) . '):/'; 

return preg_replace($pattern, ' <img width="22" src="' . base_url('assets/img/emojiones') . '/$1.png" alt="$1"> ', $str); 
+0

很好的答案。現在我知道如果我想在函數內部使用全局變量,我可以使用「use(array)」。 –

0
function out_emoj($str) 
{ 
    $emoj_array = array(
     "cry", "grimacing", "joy","smiley","innocent", "wink", "flushed", "slight_smile", 
     "stuck_out_tongue_winking_eye", "relaxed", "crab","cat","expressionless", "pig", "rose", "cherry_blossom", 
     "sunny", "cloud_snow", "coffee","tea","grin", "ring", "crown", "nerd", 
     "heart_eyes", "kissing_heart", "sunglasses","scream","rage","disappointed","fearful","confused", 
     "dizzy_face", "zipper_mouth", "thermometer_face","sleeping","ghost","smiley_cat","smile_cat","joy_cat", 
     "heart_eyes_cat", "smirk_cat", "kissing_cat","scream_cat","crying_cat_face","pouting_cat","thumbsup","thumbsdown", 
     "angel", "dancer", "kimono","heart","purple_heart","sparkling_heart","heart_decoration","snowflake", 
     ); 

    return preg_replace_callback("/:(.*?):/", 
     function($m) use ($emoj_array) 
     { 

      if (in_array($m[1],$emoj_array)) 
      { 
       return " <img width='22' src='".base_url('assets/img/emojiones/'.$m[1].'.png')."' alt='{$m[1]}'> "; 
      } 
      else 
      { 
       return ':'.$m[1].':'; 
      } 
     } 
    , $str); 

} 

謝謝@Casimir等伊波利特和@ rizier123這裏是我的解決方案

+0

'str_replace'沒用,因爲你想要的是已經在$ m [1] *(第一個捕獲組)*中。 –

+0

thnx @CasimiretHippolyte –

+0

請參閱我的編輯其他方式。 –

相關問題