UBB / Smileys有时不会更换

时间:2010-08-12 10:03:45

标签: php

使用下面的代码,一些表情符号将无效(文本不会被笑脸取代)。当我更改$ smileys数组的顺序时,破碎的表情符号会起作用,但其他人则不会。

所以我知道$ smileys数组的顺序决定了表情符号的替换,但我不知道为什么。

有人可以帮助我让所有的笑脸都能正常工作吗?感谢

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;
}

2 个答案:

答案 0 :(得分: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));

答案 1 :(得分: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/>";
    }
}