2010-08-12 138 views
0

隨着下面的代碼一些表情符號不會工作(文本不會被笑臉代替)。當我改變$笑臉陣列的順序時,破碎的笑臉工作,但其他人不工作。UBB /笑臉不會替代

所以我知道$笑臉數組的順序決定了表情符號的替換,但我不知道爲什麼。

任何人都可以幫助我讓所有表情都正常工作嗎?謝謝

public $smileys = array(
    'tongetje.gif' => array(':p',':P'), 
    'cool.gif' => array(':8'), 
    'dansen.gif'=> array('(dance)'), 
    'mondje_dicht.gif' => array(':|'), 
    'muur_hoofd.gif' => array('|:('), 
    'huilen.gif' => array('(h)'), 
    'loser.gif' => array('(:)'), 
    'lachje.gif' => array(':)',':-)'), 
    'wink.gif' => array(';)'), 
    'lach.gif' => array(':d',':-D'), 
    'lollol.gif' => array(':#'), 
    'bloos.gif' => array('(b)'), 
    'stom.gif' => array(':s'), 
    'doei.gif' => array('(d)'), 
    'engeltje.gif' => array('O-)'), 
    'boze_smiley.gif' => array(':('), 
    '1april.gif' => array(':1)'), 
    'koning.gif' => array('(koning)'), 
    'offtopic.gif' => array('*-*'), 
    'opgeven_verlegen.gif' => array('O+'), 
    'piraat.gif' => array(':F'), 
    'politie.gif' => array('(p)'), 
    'reggae.gif' => array('(r)'), 
    'jammie.gif' => array(':9'), 
    'schamen.gif' => array(':-8'), 
    'verliefd.gif' => array(':00'), 
    'middelvinger.gif' => array(':--') 
);  

private function ubb_smileys($string) { 
    $counter = 1; 
    foreach($this->smileys as $imagename => $imagetags) { 
     if(is_numeric($this->smilies_enable)) { 
      if($counter <= $this->smilies_enable) { 
       foreach($imagetags as $int => $tag) { 
        $tag = str_replace("\\", "", $tag); 
        $src = UBB_SMILEYS_PATH.$imagename; 
        $image = UBB_SMILEYS_STRING; 
        $image = str_replace('${TAG}', $tag, $image); 
        $image = str_replace('${SRC}', $src, $image); 
        $string = str_replace($tag, $image, $string); 

       } 
      } 
     } else { 
      foreach($imagetags as $int => $tag) { 
       $tag = str_replace("\\", "", $tag); 
       $src = UBB_SMILEYS_PATH.$imagename; 
       $image = UBB_SMILEYS_STRING; 
       $image = str_replace('${TAG}', $tag, $image); 
       $image = str_replace('${SRC}', $src, $image); 
       $string = str_replace($tag, $image, $string); 

      } 
     } 
     $counter++; 
    } 
    return $string; 
} 
+0

哪些笑臉工作,哪些不? – 2010-08-12 10:08:32

回答

0

我認爲這是因爲一些表情符號是其他人的子集。例如':)'是'(:)'的子集。所以如果它在':)'之前,'(:)'將永遠找不到。

首先包括最複雜的那個,然後任何笑臉都是其他笑臉的子集,必須晚一些。

這解釋了爲什麼訂購會影響您的結果。

這就是說---我找不到上面張貼的順序排序的具體示例(儘管我可能沒有找到足夠長的時間)。有了上述訂單,哪些表情符號不適合你?

編輯:

我測試了下面。對我來說工作得很好。你用什麼作爲測試字符串?

define('UBB_SMILEYS_PATH', '/images/'); 
define('UBB_SMILEYS_STRING', '<img src="${SRC}" alt="${TAG}" />'); 

class UBB { 
    public $smileys_enable; 

    public function __construct() { 
     $this->smilies_enable = 100; 
    } 

    public $smileys = array(
     'tongetje.gif' => array(':p',':P'), 
     'cool.gif' => array(':8'), 
     'dansen.gif'=> array('(dance)'), 
     'mondje_dicht.gif' => array(':|'), 
     'muur_hoofd.gif' => array('|:('), 
     'huilen.gif' => array('(h)'), 
     'loser.gif' => array('(:)'), 
     'lachje.gif' => array(':)',':-)'), 
     'wink.gif' => array(';)'), 
     'lach.gif' => array(':d',':-D'), 
     'lollol.gif' => array(':#'), 
     'bloos.gif' => array('(b)'), 
     'stom.gif' => array(':s'), 
     'doei.gif' => array('(d)'), 
     'engeltje.gif' => array('O-)'), 
     'boze_smiley.gif' => array(':('), 
     '1april.gif' => array(':1)'), 
     'koning.gif' => array('(koning)'), 
     'offtopic.gif' => array('*-*'), 
     'opgeven_verlegen.gif' => array('O+'), 
     'piraat.gif' => array(':F'), 
     'politie.gif' => array('(p)'), 
     'reggae.gif' => array('(r)'), 
     'jammie.gif' => array(':9'), 
     'schamen.gif' => array(':-8'), 
     'verliefd.gif' => array(':00'), 
     'middelvinger.gif' => array(':--') 
    );  

    private function ubb_smileys($string) { 
     $counter = 1; 
     foreach($this->smileys as $imagename => $imagetags) { 
      if(is_numeric($this->smilies_enable)) { 
       if($counter <= $this->smilies_enable) { 
        foreach($imagetags as $int => $tag) { 
         $tag = str_replace("\\", "", $tag); 
         $src = UBB_SMILEYS_PATH.$imagename; 
         $image = UBB_SMILEYS_STRING; 
         $image = str_replace('${TAG}', $tag, $image); 
         $image = str_replace('${SRC}', $src, $image); 
         $string = str_replace($tag, $image, $string); 

        } 
       } 
      } else { 
       foreach($imagetags as $int => $tag) { 
        $tag = str_replace("\\", "", $tag); 
        $src = UBB_SMILEYS_PATH.$imagename; 
        $image = UBB_SMILEYS_STRING; 
        $image = str_replace('${TAG}', $tag, $image); 
        $image = str_replace('${SRC}', $src, $image); 
        $string = str_replace($tag, $image, $string); 

       } 
      } 
      $counter++; 
     } 
     return $string; 
    } 
    public function parse_smileys($str) { 
     return $this->ubb_smileys($str); 
    } 
} 

$ubb = new UBB(); 

$myStr = 'xxx :-) :s lalala (d) :(Some text'; 

echo($ubb->parse_smileys($myStr)); 
+0

例如:s和(d)在上面的代碼中不起作用。 $ {TAG}將被替換,而不是一個變量。 – Arjen 2010-08-12 10:39:56

+0

看起來排序不會影響笑臉的工作,因爲:s不會被替換,但是這個仍然不起作用。 – Arjen 2010-08-12 10:50:19

+0

已修改。 :s和(d)在上面的例子中爲我工作(這只是你的代碼和測試腳手架)。 – Jhong 2010-08-12 12:38:09

0

我想你需要在成功更換時短路foreach循環。這是我做的測試它,作爲一個完整的文件:

<pre> 
<?php 
define('UBB_SMILEYS_PATH', 'c:\\'); 
define('UBB_SMILEYS_STRING', '(img src="${SRC}" alt="${TAG}" /)'); 
class ubb { 
var $smilies_enable = true; 
public $smileys = array(
    'tongetje.gif' => array(':p',':P'), 
    'cool.gif' => array(':8'), 
    'dansen.gif'=> array('(dance)'), 
    'mondje_dicht.gif' => array(':|'), 
    'muur_hoofd.gif' => array('|:('), 
    'huilen.gif' => array('(h)'), 
    'loser.gif' => array('(:)'), 
    'lachje.gif' => array(':)',':-)'), 
    'wink.gif' => array(';)'), 
    'lach.gif' => array(':d',':-D'), 
    'lollol.gif' => array(':#'), 
    'bloos.gif' => array('(b)'), 
    'stom.gif' => array(':s'), 
    'doei.gif' => array('(d)'), 
    'engeltje.gif' => array('O-)'), 
    'boze_smiley.gif' => array(':('), 
    '1april.gif' => array(':1)'), 
    'koning.gif' => array('(koning)'), 
    'offtopic.gif' => array('*-*'), 
    'opgeven_verlegen.gif' => array('O+'), 
    'piraat.gif' => array(':F'), 
    'politie.gif' => array('(p)'), 
    'reggae.gif' => array('(r)'), 
    'jammie.gif' => array(':9'), 
    'schamen.gif' => array(':-8'), 
    'verliefd.gif' => array(':00'), 
    'middelvinger.gif' => array(':--') 
);  

public function ubb_smileys($string) { 
    $counter = 0; 
    foreach($this->smileys as $imagename => $imagetags) { 
     $f = false; 
     if(is_numeric($this->smilies_enable)) { 
      if($counter <= $this->smilies_enable) { 
       foreach($imagetags as $int => $tag) { 
        $tag = str_replace("\\", "", $tag); 
        $src = UBB_SMILEYS_PATH.$imagename; 
        $image = UBB_SMILEYS_STRING; 
        $image = str_replace('${TAG}', $tag, $image); 
        $image = str_replace('${SRC}', $src, $image); 
        if(strstr($string, $tag)) { 
         $string = str_replace($tag, $image, $string); 
         $f = true; 
         break; 
        } 
       } 
      } 
     } else { 
      foreach($imagetags as $int => $tag) { 
       $tag = str_replace("\\", "", $tag); 
       $src = UBB_SMILEYS_PATH.$imagename; 
       $image = UBB_SMILEYS_STRING; 
       $image = str_replace('${TAG}', $tag, $image); 
       $image = str_replace('${SRC}', $src, $image); 
       if(strstr($string, $tag)) { 
        $string = str_replace($tag, $image, $string); 
        $f = true; 
        break; 
       } 
      } 
     } 
     $counter++; 
     if($f) break; 
    } 
    return $string; 
} 
} 

$ubb = new ubb(); 
foreach($ubb->smileys as $s) { 
    foreach($s as $ss) { 
     $phr = "lol $ss"; 
     echo $phr . " -&gt; " .($ubb->ubb_smileys($phr)); 
     echo "<br/>"; 
    } 
} 
+0

如果你傳遞一個帶有多個表情符號的字符串,這將不起作用 – Jhong 2010-08-12 12:08:32

+0

合理;也許反覆調用該函數,直到它不改變任何東西。 – lotsoffreetime 2010-08-12 12:44:57