2012-05-29 3 views
4

텍스트 이모리 등을 이미지 이모티콘으로 대체하는 기능이 있습니다대용 함수에서 대소 문자를 구별하지 않게 만들기

어떻게 대소 문자를 구분하지 않습니까? 나는 대용품에서 "GI"와 "IG"를 사용하여 시도했지만,이 차이

var emots = { 
    ':)' : 'smile', 
    ':-)' : 'smile', 
    ';)' : 'wink', 
    ';-)' : 'wink', 
    ':(' : 'downer', 
    ':-(' : 'downer', 
    ':D' : 'happy', 
    ':-D' : 'happy', 
    '(smoke)' : 'smoke', 
    '(y)' : 'thumbsup', 
    '(b)' : 'beer', 
    '(c)' : 'coffee', 
    '(cool)' : 'cool', 
    '(hehe)' : 'tooth', 
    '(haha)' : 'tooth', 
    '(lol)' : 'tooth', 
    '(pacman)' : 'pacman', 
    '(hmm)' : 'sarcastic', 
    '(woot)' : 'woot', 
    '(pirate)' : 'pirate', 
    '(wtf)' : 'wtf' 
}; 

function smile(str){ 
    var out = str; 
     for(k in emots){ 
      out = out.replace(k,'<img src="/emoticons/'+emots[k]+'.gif" title="'+k+'" />','g'); 
     } 
    return out; 
}; 
+0

"i"는 내가보기에 파이어 폭스에서만 작동합니다. – mowgli

답변

2

변경 할 것 does'nt :

out = out.replace(k,'<img src="/emoticons/'+emots[k]+'.gif" title="'+k+'" />','g'); 

사람 :

out = out.replace(new RegExp(k.replace(/[-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"), 'ig'), '<img src="/emoticons/'+emots[k]+'.gif" title="'+k+'" />'); 
에게

이 대답에서 가져온 정규식 이스케이프 함수 Escape string for use in Javascript regex

+0

그 안에는 (k in emots) {)가 있습니까? – mowgli

+0

@mowgli 네, 그렇습니다. 그것은 단지 당신의 replace 함수에서 플래그를 가져 와서 정규 표현식에 대한 플래그로 변환하는 것입니다. 'escapeRegExp'는 모든 특수한 정규 표현식 문자를 이스케이프합니다. 실제로는'('및')'를 입력으로 이스케이프해야하지만,':]'또는 다른 문자를 사용하는 새 이모티콘을 추가 할 경우 모든 것을 이스케이프하는 것이 좋습니다 에. – Paulpro

+0

좋아요;)하지만 내 생각에는 ... 루프 내에서 함수를 만드는 것이 잘못입니까? 그것은 내가 추측 한 각각의 편지에 대해 만들어 질 것입니다 (확인되지 ​​않고 다시 만들어지지 않습니다.) – mowgli

1

이것은 약간 까다 롭습니다. 표면에 ppears. 다음은 완벽한 솔루션입니다. 단순성과 효율성을 위해 대상 문자열에서 한 개의 정규식 검색 만 사용합니다. 이 둔감 경우가 있기 때문에 (예를 들면, (hehe)(HeHe)은 동일하게 취급된다)

참고 :-d 또한 :-D와 동일하게 취급된다.

var emots = { 
    ':)' : 'smile', 
    ':-)' : 'smile' 
    // Add the rest of your emoticons... 
}; 

// Build the regex that will be used for searches 
var emotSearch = []; 
for (var p in emots) { 
    if (emots.hasOwnProperty(p)) { 
     emotSearch.push(p.replace(/[-[{()*+?.\\^$|]/g, '\\$&')); 
     if (p !== p.toLowerCase()) { 
      emots[p.toLowerCase()] = emots[p]; 
     } 
    } 
} 
emotSearch = RegExp(emotSearch.join('|'), 'gi'); 

function smile(str) { 
    return str.replace(emotSearch, function ($0) { 
     var emot = $0.toLowerCase(); 
     if (emot in emots) { 
      return '<img src="/emoticons/' + emots[emot] + '.gif" title="' + $0 + '" />'; 
     } 
     return $0; 
    }); 
} 
+0

와우 많은 코드 .. 그것을 시도하지 않았다. 다른 짧은 대답은 완벽했습니다. 그리고 간단합니다.) – mowgli

+0

그래. 하지만 당신이 알고있는 바로는, emoticon의 모든 속성에 대해 별도의 검색 - 바꾸기가 필요하다는 것을 알고 있기 때문에 이모티콘을 추가 할 때 효율성이 떨어지고 느려집니다. 또한 정규식 메타 문자를 이스케이프 처리하기 위해 불필요하게 자세한 정규식을 사용합니다. – slevithan

-2

또는 그냥 입력에 .toLowerCase() 당신은 검사를 실행 사용하기 전에?

관련 문제