2011-01-08 33 views
2

我想用除了div的特定字符串替換som字符。 這裏是我的str_replace函數:在div標記中沒有str_replace

// smileys 
    $in = array(
     ':)', 
     ':D', 
     ':o', 
     ':p', 
     ':(', 
     ';)', 
     'xD', 
     '^^', 
    ); 
    $out = array(
     '<img alt=":)" style="padding-left:3px;" src="img/emoticons/emoticon_smile.png" />', 
     '<img alt=":D" style="padding-left:3px;" src="img/emoticons/emoticon_happy.png" />', 
     '<img alt=":o" style="padding-left:3px;" src="img/emoticons/emoticon_surprised.png" />', 
     '<img alt=":p" style="padding-left:3px;" src="img/emoticons/emoticon_tongue.png" />', 
     '<img alt=":(" style="padding-left:3px;" src="img/emoticons/emoticon_unhappy.png" />', 
     '<img alt=";)" style="padding-left:3px;" src="img/emoticons/emoticon_wink.png" />', 
     '<img alt="xD" style="padding-left:3px;" src="img/emoticons/emoticon_evilgrin.png" />', 
     '<img alt="^^" style="padding-left:3px;" src="img/emoticons/emoticon_happy.png" />' 
    ); 
    $text = str_replace($in, $out, $text); 

的變量$文本可以有<div class="code-geshi"></div>但我ddon't想str_replace函數的表情去 我怎樣才能做到這一點?

謝謝:)

PS:對不起我的英文不好...

+0

如果`$ text`包含標記你應該使用[DOM解析器](http://stackoverflow.com/questions/3577641/best-methods-to-parse-html/3577662#3577662),並且只在文檔的文本節點上運行你的`str_replace`到防止意外更換元素屬性。 – Gordon 2011-01-08 22:39:38

回答

0

你不能用str_replace函數做到這一點。使用preg_replace

+0

好的,你能舉個例子嗎?謝謝。 – CrazyMax 2011-01-08 21:48:30

0

我用了一種不同的方式。在我的函數解析代碼:

$text = preg_replace_callback('/\[code\="?(.*?)"?\](.*?)\[\/code\]/ms', "gen_geshi", $text); 

我通過添加字符替換潛在的笑臉:

if (!function_exists('gen_geshi')) { 
     function gen_geshi($s){ 
      global $text; 
      $result = ""; 
      $list_languages = array('html4strict', 'php', 'javascript', 'css'); 
      $name_languages = array(
       'html4strict' => 'HTML', 
       'php'   => 'PHP', 
       'javascript' => 'Javascript', 
       'css'   => 'CSS' 
      ); 
      $text = strip_tags($text); 
      $language = $s[1]; 
      $code = $s[2]; 

      $smileys_in = array(
       ':)', 
       ':D', 
       ':o', 
       ':p', 
       ':(', 
       ';)', 
       'xD', 
       '^^', 
      ); 
      $smileys_out = array(
       '**-|-**:**-|-**)**-|-**', 
       '**-|-**:**-|-**D**-|-**', 
       '**-|-**:**-|-**o**-|-**', 
       '**-|-**:**-|-**p**-|-**', 
       '**-|-**:**-|-**(**-|-**', 
       '**-|-**;**-|-**)**-|-**', 
       '**-|-**x**-|-**D**-|-**', 
       '**-|-**^**-|-**^**-|-**', 
      ); 

      $code = str_replace($smileys_in, $smileys_out, $code); 

      if(in_array($language, $list_languages) && !empty($code)){ 
       global $lang; 
       $code = trim(preg_replace('#\t#', ' ', $code)); 
       if (!class_exists('GeSHi')) include('inc/geshi/geshi.php'); 
       $geshi = new GeSHi($code, $language); 
       $geshi->enable_line_numbers(GESHI_NORMAL_LINE_NUMBERS); 
       $result = '<div class="code-geshi-overall">' . $lang->get['global']['code'] . ' ' . $name_languages[$language] . ' : </div><div class="code-geshi">' . $geshi->parse_code() . '</div>'; 
      } 

      return $result; 
     } 
    } 

然後我使用str_replace函數:

$text = str_replace('**-|-**', '', $text);