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<
但如何呢?为什么? 为什么它没有显示正确的笑脸?
问候
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
正如 ck3g 所说,移动
':)' => 'happy.gif',
下面'0:)' => '伪君子.gif',
As ck3g said, move
':)' => 'happy.gif',
below'0:)' => 'hypocrite.gif',
你已经有案子了。您的
0<:)
是:)
的一部分。第一次替换后,您会得到0
您会遇到与
':(' => 'sad.png'
相同的问题You have already on case. Your
0<:)
is part of:)
. After first replacement you get0<happy.gif
You'll get same issue with
':(' => 'sad.png'
正如米歇尔所说。它进行“非贪婪”替换。您可能想阅读贪婪正则表达式(@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)
正如已经说过的,您应该拥有包含同一数组中首先出现的其他值的值。
例如 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.