2011-09-06 75 views
1

我需要創建一個功能性,這將允許我解析一個文本,尋找匹配不同格式的表情符串。它可以是一個:)類型表情符號或&lt;dog&gt;<dog>)類型。 目前我的函數可以找到這兩種類型,但需要兩個不同的正則表達式完成這個任務,我想,使其在短短的一步。有任何想法嗎 ?正則表達式匹配各種類型的表情符號列表

在的jsfiddle

活生生的例子:http://jsfiddle.net/rmQSx/5/

,代碼:

function replaceEmoticons(text) { 
    var emots1 = { 
     ':)': 'smile.gif', 
     ':(': 'sad.gif', 
    }, 
    emots2 = { 
     '&lt;dog&gt;': 'dog.gif', 
     '&lt;fly&gt;': 'fly.gif' 
    }, 
    regex1,regex2,p,re; 


    for(p in emots1){ 
     regex1 = "["+p+"]{2}"; 
     re = new RegExp(regex1, "g"); 

     text = text.replace(re, function (match) { 
      return typeof emots1[match] != 'undefined' ? 
       '<img src="'+emots1[match]+'"/>' : 
       match; 
     }); 
    } 

    for(p in emots2){ 
     regex2 = "("+p+")(|$)"; 
     re = new RegExp(regex2, "g"); 

     text = text.replace(re, function(match) { 
      return typeof emots2[match] != 'undefined' ? 
       '<img src="'+emots2[match]+'"/>' : 
       match; 
     }); 
    } 

    return text; 
} 

console.log(replaceEmoticons('this is &lt;dog&gt;b a&lt;fly&gt; simple test :) , ;) and more:):(')); 

回答

3

我敢肯定你並不需要你做的有趣的東西在每個for循環修改正則表達式的開始。擺脫這一點,並沒有什麼阻止你將兩套合併在一起。

但是,你應該使的正則表達式時躲避特殊字符在你的笑臉()。另外,我建議做正則表達式搜索不區分大小寫,這樣<dog><DOG>都匹配。

//helper function to escape special characters in regex 
function RegExpEscape(text) { 
    return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); 
} 

function replaceEmoticons(text) { 
    var emots = { 
     ':)'   : 'smile.gif', 
     ':('   : 'sad.gif', 
     '&lt;dog&gt;': 'dog.gif', 
     '&lt;fly&gt;': 'fly.gif' 
    } 

    var result = text; 
    var emotcode; 
    var regex; 

    for (emotcode in emots) 
    { 
     regex = new RegExp(RegExpEscape(emotcode), 'gi'); 
     result = result.replace(regex, function(match) { 
      var pic = emots[match.toLowerCase()]; 

      if (pic != undefined) { 
       return '<img src="' + pic + '"/>'; 
        } else { 
       return match; 
        } 
       }); 
    } 

    return result;  
} 
+0

的作品就像一個魅力 – mikeTa

0

使用|

,你可以這樣做:

re = new RegExp(smiley1|smiley2|...|smileyN);