现在我正在将此功能用于表情符号:
function emoticons($text) {
$icons = array(
':)' => '<img src="/images/blank.gif" alt="smile" class="icon_smile" />',
':-)' => '<img src="/images/blank.gif" alt="smile" class="icon_smile" />',
':D' => '<img src="/images/blank.gif" alt="smile" class="icon_laugh" />',
':d' => '<img src="/images/blank.gif" alt="laugh" class="icon_laugh" />',
';)' => '<img src="/images/blank.gif" alt="wink" class="icon_wink" />',
':P' => '<img src="/images/blank.gif" alt="tounge" class="icon_tounge" />',
':-P' => '<img src="/images/blank.gif" alt="tounge" class="icon_tounge" />',
':-p' => '<img src="/images/blank.gif" alt="tounge" class="icon_tounge" />',
':p' => '<img src="/images/blank.gif" alt="tounge" class="icon_tounge" />',
':(' => '<img src="/images/blank.gif" alt="sad face" class="icon_sad" />',
':o' => '<img src="/images/blank.gif" alt="shock" class="icon_shock" />',
':O' => '<img src="/images/blank.gif" alt="shock" class="icon_shock" />',
':0' => '<img src="/images/blank.gif" alt="shock" class="icon_shack" />',
':|' => '<img src="/images/blank.gif" alt="straight face" class="icon_straight" />',
':-|' => '<img src="/images/blank.gif" alt="straight face" class="icon_straight" />',
':/' => '<img src="/images/blank.gif" alt="straight face" class="icon_straight" />',
':-/' => '<img src="/images/blank.gif" alt="straight face" class="icon_straight" />'
);
return strtr($text, $icons);
}
但是,如果您输入了一个链接,:/
的{{1}}部分会被替换:
与代码相同(每行前面有4个空格来创建代码框),但由于某种原因,简单的http://
也会被替换(使用眨眼):
有没有比这更换所有图标更好的解决方案?它显然不起作用。我在Google上搜索了很多,但没有找到更好的方法。我也试过在上面的关联数组中的每个表情符号之前放置一个空格,但是如果你只输入一个:)之前没有任何东西就行不通。
答案 0 :(得分:12)
您可以使用preg_replace函数,然后在正则表达式中使用单词边界。
foreach($icons as $icon=>$image) {
$icon = preg_quote($icon);
$text = preg_replace("~\b$icon\b~",$image,$text);
}
您需要使用单词边界而不是空格,因为这将处理起点和终点。需要一个空格才意味着只找到一个:)。
答案 1 :(得分:1)
正则表达式很慢,如果文字很大,就像我喜欢的那样,你应该只插入一个图标,如果它被空格包围,这样你的用户在尝试时就不会骚乱写网址。
答案 2 :(得分:1)
我不确定它是否会起作用,但我会尝试添加一些额外的空格:
function emoticons($text) {
$icons = array(
' :) ' => ' <img src="/images/blank.gif" alt="smile" class="icon_smile" /> ',
' :-) ' => ' <img src="/images/blank.gif" alt="smile" class="icon_smile" /> ',
' :D ' => ' <img src="/images/blank.gif" alt="smile" class="icon_laugh" /> ',
' :d ' => ' <img src="/images/blank.gif" alt="laugh" class="icon_laugh" /> ',
' ;) ' => ' <img src="/images/blank.gif" alt="wink" class="icon_wink" /> ',
' :P ' => ' <img src="/images/blank.gif" alt="tounge" class="icon_tounge" /> ',
' :-P ' => ' <img src="/images/blank.gif" alt="tounge" class="icon_tounge" /> ',
' :-p ' => ' <img src="/images/blank.gif" alt="tounge" class="icon_tounge" /> ',
' :p ' => ' <img src="/images/blank.gif" alt="tounge" class="icon_tounge" /> ',
' :( ' => ' <img src="/images/blank.gif" alt="sad face" class="icon_sad" /> ',
' :o ' => ' <img src="/images/blank.gif" alt="shock" class="icon_shock" /> ',
' :O ' => ' <img src="/images/blank.gif" alt="shock" class="icon_shock" /> ',
' :0 ' => ' <img src="/images/blank.gif" alt="shock" class="icon_shack" /> ',
' :| ' => ' <img src="/images/blank.gif" alt="straight face" class="icon_straight" /> ',
' :-| ' => ' <img src="/images/blank.gif" alt="straight face" class="icon_straight" /> ',
' :/ ' => ' <img src="/images/blank.gif" alt="straight face" class="icon_straight" /> ',
' :-/ ' => ' <img src="/images/blank.gif" alt="straight face" class="icon_straight" /> '
);
return strtr($text, $icons);
}
答案 3 :(得分:1)
我推荐两个库:
Emojify:https://github.com/HallgrenNetworks/emojify
PHP表情符号:https://github.com/iamcal/php-emoji
这些将为您处理这些案件。
答案 4 :(得分:0)
我认为使用regular expressions而不仅仅是定义表情符号。这可能看起来像
// replaces a :) when it is surrounded by whitespaces
return preg_replace('/\s:)\s/', '<img ...>', $text);