Другой подход:
function replaceEmoticons(text) {
var emoticons = {
':-)' : 'smile1.gif',
':)' : 'smile2.gif',
':D' : 'smile3.gif'
}, url = "http://www.domain.com/";
// a simple regex to match the characters used in the emoticons
return text.replace(/[:\-)D]+/g, function (match) {
return typeof emoticons[match] != 'undefined' ?
'<img src="'+url+emoticons[match]+'"/>' :
match;
});
}
replaceEmoticons('this is a simple test :)');
// "this is a simple test <img src="http://www.domain.com/smile2.gif"/>"
Edit:@pepkin88 сделал очень хорошее предложение, построить регулярное выражение, основанное на именах свойств в emoticons
объекта.
Это легко сделать, но мы должны избегать метасимволов, если хотим, чтобы это работало правильно.
Экранированные шаблоны хранятся в массиве, который затем используется для построения регулярного выражения с использованием конструктора RegExp
, в основном, соединяющего все шаблоны, разделенные метасимволом |
.
function replaceEmoticons(text) {
var emoticons = {
':-)' : 'smile1.gif',
':)' : 'smile2.gif',
':D' : 'smile3.gif',
':-|' : 'smile4.gif'
}, url = "http://www.domain.com/", patterns = [],
metachars = /[[\]{}()*+?.\\|^$\-,&#\s]/g;
// build a regex pattern for each defined property
for (var i in emoticons) {
if (emoticons.hasOwnProperty(i)){ // escape metacharacters
patterns.push('('+i.replace(metachars, "\\$&")+')');
}
}
// build the regular expression and replace
return text.replace(new RegExp(patterns.join('|'),'g'), function (match) {
return typeof emoticons[match] != 'undefined' ?
'<img src="'+url+emoticons[match]+'"/>' :
match;
});
}
replaceEmoticons('this is a simple test :-) :-| :D :)');
Это не сработает правильно, поскольку замена заменяет только первое вхождение совпадающей строки. – Matias
Работает только для замены первого появления каждого смайлика. В строке типа «Это заменено :), но не это :)», второй остается неизменным. – Guffa
Также не забудьте использовать 'var' в' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ', если код находится внутри функции, 'if (emoticons.hasOwnProperty (улыбка))' внутри цикла - хорошая идея. – CMS