当用户想发布笑脸时,我正在进行bb代码替换功能。
问题是,如果有人使用不存在的bb代码笑脸,则会导致空帖,因为浏览器不会显示(不存在的)表情符号。
到目前为止,这是我的代码:
// DO [:smiley:]
$convert_smiley = preg_match_all('/\[:(.*?):\]/i', $string, $matches);
if( $convert_smiley )
{
$string = preg_replace('/\[:(.*?):\]/i', "<i class='icon-smiley-$1'></i>", $string, $convert_smiley);
}
return $string;
笑脸的bb代码通常看起来像[:smile:]
或类似[:sad:]
或类似[:happy:]
,依此类推。
上面的代码运行良好,直到有人发布了不存在的bb代码,所以我要求的是修复非现有的表情符号。
在示例中是否有可能创建一个数组,如array('smile', 'sad', 'happy')
,只有与此数组中的一个或多个匹配的bb代码才会被转换?
因此,在修复之后,不应转换发布[:test:]
或仅发布[::]
,并且应在转换[:happy:]
时将其作为原始文本发布。
有什么想法吗?谢谢!
答案 0 :(得分:1)
一个简单的解决方法:
$string ="[:clap:]";
$convert_smiley = preg_match_all('/\[:(.*?):\]/i', $string, $matches);
$emoticons = array("smile","clap","sad"); //array of supported smileys
if(in_array($matches[1][0],$emoticons)){
//smily exists
$string = preg_replace('/\[:(.*?):\]/i', "<i class='icon-smiley-$1'></i>", $string, $convert_smiley);
}
else{
//smily doesn't exist
}
答案 1 :(得分:1)
好吧,第一个问题是您要将$convert_smiley
设置为true
的{{1}} / false
值而不是解析结果。以下是我重写代码的方法:
preg_match_all()
请注意,我选择使用sprintf()
来格式化内容&amp;将// Test strings.
$string = ' [:happy:] [:frown:] [:smile:] [:foobar:]';
// Set a list of valid smileys.
$valid_smileys = array('smile', 'sad', 'happy');
// Do a `preg_match_all` against the smiley’s
preg_match_all('/\[:(.*?):\]/i', $string, $matches);
// Check if there are matches.
if (count($matches) > 0) {
// Loop through the results
foreach ($matches[1] as $smiley_value) {
// Validate them against the valid smiley list.
$pattern = $replacement = '';
if (in_array($smiley_value, $valid_smileys)) {
$pattern = sprintf('/\[:%s:\]/i', $smiley_value);
$replacement = sprintf("<i class='icon-smiley-%s'></i>", $smiley_value);
$string = preg_replace($pattern, $replacement, $string);
}
}
}
echo 'Test Output:';
echo htmlentities($string);
和$pattern
设置为变量。我还选择使用$replacement
,因此可以轻松读取HTML DOM元素以进行调试。
答案 2 :(得分:1)
我把你可能的笑脸放在带有or
符号的非分组括号中的正则表达式中:
<?php
$string = 'looks like [:smile:] or like [:sad:] or like [:happy:] [:bad-smiley:]';
$string = preg_replace('/\[:((?:smile)|(?:sad)|(?:happy)):\]/i', "<i class='icon-smiley-$1'></i>", $string);
print $string;
输出:
looks like <i class='icon-smiley-smile'></i> or like <i class='icon-smiley-sad'></i> or like <i class='icon-smiley-happy'></i> [:bad-smiley:]
[:bad-smiley:]被忽略了。