我正在制作自己的论坛软件。 你的论坛中有笑脸是正常的。
所以我用所有的笑脸制作了一个数组并将它们放在一个函数中:
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℃;
但是怎么样?为什么? 为什么它没有表现出正确的笑脸?问候
答案 0 :(得分:2)
正如ck3g所说,将':)' => 'happy.gif',
移到'0:)' => 'hypocrite.gif',
答案 1 :(得分:1)
':)' => 'happy.gif'
你已经处理了案件。您的0<:)
是:)
的一部分。首次替换后,您将获得0<happy.gif
':(' => 'sad.png'
答案 2 :(得分:0)
答案 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
您可能需要它们来扩展您的代码。这些都是基于堆栈的解析器,可确保正确嵌套,甚至可以正确解析嵌套的引用标记。
对于独立脚本,请使用最后一个示例。可轻松扩展,无依赖性。