str_replace不会替换所有键?

时间:2011-03-07 15:10:12

标签: php str-replace

我正在制作自己的论坛软件。 你的论坛中有笑脸是正常的。

所以我用所有的笑脸制作了一个数组并将它们放在一个函数中:

function si_ubb($string){
    $smileys = array(
        '0<:)' => 'angelnot.gif',
        '>:(' => 'angry.gif',
        ':@' => 'blush.gif',
        ':*' => 'cencored.png',
        ':?' => 'confused.gif',
        ';(' => 'cry.png',
        ':D' => 'grin.gif',
        ':)' => 'happy.gif',
        ':|' => 'hmm.png',
        '0:)' => 'hypocrite.gif',
        ':x:' => 'lock.gif',
        '<3' => 'love.gif',
        '8)' => 'rolleyes.gif',
        ':(' => 'sad.png',
        '|)' => 'shifty.gif',
        'O_o' => 'shock.gif',
        '8)' => 'sunglasses.gif',
        '^_^' => 'sweatingbullets.gif',
        ':p' => 'tongue.gif',
        ':P' => 'tongue.gif',
        ';)' => 'wink.gif',
        '>.<' => 'wry.gif',
        'XD' => 'wry.gif',
        'xD' => 'wry.gif'
    );

    foreach($smileys as $code => $image){
        $string = str_replace($code, $image, $string);
    }

    return $string;
}   

但是,嗯,我现在这样做了:

echo si_ubb('0<:)');

它给出了这个?

0℃; Image

但是怎么样?为什么? 为什么它没有表现出正确的笑脸?

问候

4 个答案:

答案 0 :(得分:2)

正如ck3g所说,将':)' => 'happy.gif',移到'0:)' => 'hypocrite.gif',

以下

答案 1 :(得分:1)

':)' => 'happy.gif'

你已经处理了案件。您的0<:):)的一部分。首次替换后,您将获得0<happy.gif

':(' => 'sad.png'

会遇到同样的问题

答案 2 :(得分:0)

像米歇尔说的那样。它做了'非贪婪'替换。您可能想要阅读greedy-regexp(@see preg_replace)

答案 3 :(得分:0)

如前所述,您应该在第一个出现的同一个数组中包含其他值。

例如0 :)之前:)

即使在没有正确的贪婪修饰符的情况下使用preg_replace,这也会影响替换的种类。

关于foreach循环的冗余,我不确定但你可以尝试使用array_keys()和array_values()作为参数并查看(我使用与preg_replace类似的东西。我从未尝试使用str_replace()。)

Str_replace(array_keys($codes), array_values($codes), $string);

但是,你为什么不看看梨bbcode_parser甚至是bbcode模块或http://www.christian-seiler.de/projekte/php/bbcode/index_en.html

您可能需要它们来扩展您的代码。这些都是基于堆栈的解析器,可确保正确嵌套,甚至可以正确解析嵌套的引用标记。

对于独立脚本,请使用最后一个示例。可轻松扩展,无依赖性。