2011-01-08 69 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);