2016-02-28 2 views
3

У меня есть этот массив, который содержит символы эмо и связанные файлы изображений для каждого пути эмо.Javascript Regex соответствует символам смайликов в моем массиве

Working demo of my code on JSFIDDLE

Но используя этот код, только :) это эмо возвращает правильный smile.png изображение, но остальная часть эмо не работают.

Как написать правильное регулярное выражение, соответствующее каждому из этих символов, и выбрать соответствующий файл для каждого emo?

//Replace Emo with images 
    function replaceEmoticons(text) { 
    var emoticons = { 
    ':)' : 'smile.png', 
    ':)' : 'smile.png', 
    ':D' : 'laugh.png', 
    ':->' : 'laugh.png', 
    ':d' : 'laugh-sm.png', 
    ':-)': 'smile-simple.png', 
    ':p': 'tounge.png', 
    ':P': 'tounge-lg.png', 
    ': P': 'tng1.png', 
    '>-)': 'evil.png', 
    ':(': 'sad.png', 
    ':-(': 'sadd.png', 
    ':-<': 'sadd.png', 
    ':-O': 'surprise.png', 
    ':O': 'sur2.png', 
    ':o': 'sur3.png', 
    ':-o': 'sur3.png', 
    ':-*': 'kiss.png', 
    ':*': 'kiss.png', 
    ':[email protected]': 'angry.png', 
    ':@': 'angry.png', 
    ':$': 'con2.png', 
    ':-$': 'con1.png', 
    'O.o': 'con2.png', 
    'o.O': 'con2.png', 
    ':/': 'weird.png', 
    ':x': 'x.png', 
    ':X': 'x.png', 
    ':!': 's.png', 
    '(:I': 'egg.png', 
    '^.^': 'kit.png', 
    '^_^': 'kit.png', 
    ';)': 'wink.png', 
    ';-)': 'wink.png', 
    ":')": 'hc.png', 
    ":'(": 'cry.png', 
    "|-O": 'yawn.png', 
    "-_-": 'poke.png', 
    ":|": 'p1.png', 
    "$_$": 'he.png' 

    }, url = "images/emo/"; 
    // a simple regex to match the characters used in the emoticons 
    return text.replace(/[:\-)D]+/g, function (match) { 

    return typeof emoticons[match] != 'undefined' ? 
      '<img class="emo" src="'+url+emoticons[match]+'"/>' : 
      match; 
    }); 
} 


replaceEmoticons("Hi this is a test string :) with all :P emos working :D"); 
+1

Проверьте это [http://stackoverflow.com/questions/28077049/regex-matching-emoticons](http : //stackoverflow.com/questions/28077049/regex-matching-) [http://stackoverflow.com/questions/7317299/regex-matching-list-of-emoticons-of-various-type](http:// stackoverflow.com/questions/7317299/regex-matching-list-of-emoticons-of-various-type) –

ответ

2

Это регулярное выражение:

[:\-)D]+ 

Не соответствует многим из смайликов в вашем списке. Любой символ, отличный от :, \, -, ), или D, не позволит его распознать.

Если у вас есть список строк, которые вы хотите сопоставить, вы можете легко создать регулярное выражение, чтобы соответствовать любому из них (и ничего больше), избегая каждого из них и соединяя их вместе с |. Что-то вроде этого:

// given a string, return the source for a regular expression that will 
// match only that exact string, by escaping any regex metacharacters 
// contained within. 
RegExp.escape = function(text) { 
    return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); 
} 

// build a regex that will match all the emoticons. Written out, it looks 
// like this: /:\)|: \)|:D|:->|:d|:-\)|:p|:P|..../g 
var emoticonRegex = 
    new RegExp(Object.keys(emoticons).map(RegExp.escape).join('|'), 'g'); 

Затем используйте, что вместо вашего буквального регулярное выражение:

return text.replace(emoticonRegex, function (match) { ... 
+0

Но КАК может написать OP регулярное выражение? (Я считаю, что это вопрос, который задает ОП). –

+0

Я добирался до этой части, @cale_b. :) –

+0

Ну, я смог написать все символы emos в своей строке и, похоже, сработал. Может ли кто-нибудь объяснить мне, как работает регулярное выражение? Нужно ли им комбинировать каждого персонажа внутри? это работает для меня, я просто не понимаю, как это работает text.replace (/ [:; \ -) ​​DPp (oO |><*! '] +/g, function (match) – Faizan

 Смежные вопросы

  • Нет связанных вопросов^_^