str_replace 不替换所有键?

发布于 2024-10-20 19:45:15 字数 1297 浏览 5 评论 0 原文

我正在制作自己的论坛软件。 嗯,论坛中出现表情符号是很正常的。

所以我用所有表情创建了一个数组,并将它们放入一个函数中:

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

但如何呢?为什么? 为什么它没有显示正确的笑脸?

问候

I'm making my own forum software.
Well its normal to have smileys in your forum.

So i made an array with all the smileys and putted them in a function:

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

But, ehm, when i do this now:

echo si_ubb('0<:)');

It gives this?

0<Image

But how? And why?
Why isn't it showing the right smiley?

Greetings

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

疯了 2024-10-27 19:45:15

正如 ck3g 所说,移动 ':)' => 'happy.gif', 下面 '0:)' => '伪君子.gif',

As ck3g said, move ':)' => 'happy.gif', below '0:)' => 'hypocrite.gif',

猥琐帝 2024-10-27 19:45:15
':)' => 'happy.gif'

你已经有案子了。您的 0<:):) 的一部分。第一次替换后,您会得到 0

您会遇到与 ':(' => 'sad.png' 相同的问题

':)' => 'happy.gif'

You have already on case. Your 0<:) is part of :). After first replacement you get 0<happy.gif

You'll get same issue with ':(' => 'sad.png'

七分※倦醒 2024-10-27 19:45:15

正如米歇尔所说。它进行“非贪婪”替换。您可能想阅读贪婪正则表达式(@see preg_replace)

Like Michiel said. It does a 'non-greedy' replace. You might want to read up on greedy-regexp's (@see preg_replace)

溺深海 2024-10-27 19:45:15

正如已经说过的,您应该拥有包含同一数组中首先出现的其他值的值。

例如 0:) 之前 :)

即使您在没有适当的贪婪修饰符的情况下使用 preg_replace,这也会影响替换的排序。

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

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

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

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

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

As already said, you should have values which contain other values in the same array appearing first.

Eg 0:) before :)

This can affect the sort of replacement even when you use preg_replace without the proper greedy modifier.

On the redundancy of the foreach loop, I am not sure but you could try array_keys() and array_values() as the parameters and see(I use something similar with preg_replace. I have never tried with str_replace().)

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

However, why don't you take a look at pears bbcode_parser or even the bbcode module or http://www.christian-seiler.de/projekte/php/bbcode/index_en.html

You might need them to extend your tags. These are all stack based parsers that ensure proper nesting and even parse nested quote tags properly.

For an independent script, use the last example. Easily extendable with no dependencies.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文