簡體   English   中英

為什么javascript正則表達式與某些表情符號不匹配

[英]Why javascript regular expression don't match some emoticons

我實現了與表情符號組合鍵匹配的javascript函數,並將其替換為span和特定的CSS類。

我確定我測試了所有受支持表情符號的系統,並且所有替代產品都工作正常。 但是現在有些表情符號字符無法匹配,我不知道為什么。

對於前。 表情符號“:P”與我的正則表達式不匹配,但與“ :)”匹配。

匹配和替換字符的功能是:

/**
     * Replace combination of chars with emoticons
     * @param rawText string
     * @returns string
     * @private
     */

    chatWindow.prototype._processEmoticons = function(rawText) {
        var fbEmoticonHolder = '<span class="emoticon :HOLDER:"></span>';

        var replacementMap = {
            ':)' : fbEmoticonHolder.replace(':HOLDER:', 'smile'),
            ':-)' : fbEmoticonHolder.replace(':HOLDER:', 'smile'),
            ':(' : fbEmoticonHolder.replace(':HOLDER:', 'sad'),
            ':-(' : fbEmoticonHolder.replace(':HOLDER:', 'sad'),
            '8-)' : fbEmoticonHolder.replace(':HOLDER:', 'geek'),
            '8)' : fbEmoticonHolder.replace(':HOLDER:', 'geek'),
            'B-)' : fbEmoticonHolder.replace(':HOLDER:', 'geek'),
            'B)' : fbEmoticonHolder.replace(':HOLDER:', 'geek'),
            ':-P' : fbEmoticonHolder.replace(':HOLDER:', 'tongue'),
            ':P' : fbEmoticonHolder.replace(':HOLDER:', 'tongue'),
            ':-p' : fbEmoticonHolder.replace(':HOLDER:', 'tongue'),
            ':p' : fbEmoticonHolder.replace(':HOLDER:', 'tongue'),
            '=P' : fbEmoticonHolder.replace(':HOLDER:', 'tongue'),
            '=p' : fbEmoticonHolder.replace(':HOLDER:', 'tongue'),
            'o.O' : fbEmoticonHolder.replace(':HOLDER:', 'speechless'),
            'O.o' : fbEmoticonHolder.replace(':HOLDER:', 'speechless'),
            ':v' : fbEmoticonHolder.replace(':HOLDER:', 'pacman'),
            'O:)' : fbEmoticonHolder.replace(':HOLDER:', 'angel'),
            'O:-)' :  fbEmoticonHolder.replace(':HOLDER:', 'angel'),
            '<3' : fbEmoticonHolder.replace(':HOLDER:', 'heart'),
            ':\'(' : fbEmoticonHolder.replace(':HOLDER:', 'cry'),
            ':-D' : fbEmoticonHolder.replace(':HOLDER:', 'laugh'),
            ':D' : fbEmoticonHolder.replace(':HOLDER:', 'laugh'),
            '=D' : fbEmoticonHolder.replace(':HOLDER:', 'laugh'),
            '8-|' : fbEmoticonHolder.replace(':HOLDER:', 'cool'),
            '8|' : fbEmoticonHolder.replace(':HOLDER:', 'cool'),
            'B-|' : fbEmoticonHolder.replace(':HOLDER:', 'cool'),
            'B|' : fbEmoticonHolder.replace(':HOLDER:', 'cool'),
            ';-)' : fbEmoticonHolder.replace(':HOLDER:', 'wink'),
            ';)' : fbEmoticonHolder.replace(':HOLDER:', 'wink'),
            ':-&' : fbEmoticonHolder.replace(':HOLDER:', 'sick'),
            ':&' : fbEmoticonHolder.replace(':HOLDER:', 'sick'),
            ':-O' : fbEmoticonHolder.replace(':HOLDER:', 'shock'),
            ':O' : fbEmoticonHolder.replace(':HOLDER:', 'shock'),
            ':-o' : fbEmoticonHolder.replace(':HOLDER:', 'shock'),
            ':o' : fbEmoticonHolder.replace(':HOLDER:', 'shock'),
            '3:)' : fbEmoticonHolder.replace(':HOLDER:', 'devil'),
            '3:-)' : fbEmoticonHolder.replace(':HOLDER:', 'devil'),
            ':-/' : fbEmoticonHolder.replace(':HOLDER:', 'mixed'),
            ':/' : fbEmoticonHolder.replace(':HOLDER:', 'mixed'),
            ':-\\' : fbEmoticonHolder.replace(':HOLDER:', 'mixed'),
            ':\\' : fbEmoticonHolder.replace(':HOLDER:', 'mixed'),
            '[[f9.rainbow]]' : fbEmoticonHolder.replace(':HOLDER:', 'rainbow'),
            '[[f9.cake]]' : fbEmoticonHolder.replace(':HOLDER:', 'cake'),
            '[[f9.coffee]]' : fbEmoticonHolder.replace(':HOLDER:', 'coffee'),
            '[[f9.gift]]' : fbEmoticonHolder.replace(':HOLDER:', 'gift'),
            '[[f9.bomb]]' : fbEmoticonHolder.replace(':HOLDER:', 'bomb'),
            '[[f9.clap]]' : fbEmoticonHolder.replace(':HOLDER:', 'clap'),
            '[[f9.sleepy]]' : fbEmoticonHolder.replace(':HOLDER:', 'sleepy'),
            '[[f9.stary]]' : fbEmoticonHolder.replace(':HOLDER:', 'stary'),
            '[[f9.heartbreak]]' : fbEmoticonHolder.replace(':HOLDER:', 'heartbreak'),
            '[[f9.inlove]]' : fbEmoticonHolder.replace(':HOLDER:', 'inlove')
        };

        var charsForReplacement = [
            ':\\)', ':-\\)', ':\\(', ':-\\(', '8-\\)', '8\\)', 'B-\\)', 'B\\)', ':-P', ':P', ':-p', ':p', '=P', '=p', 'o.O',
            'O.o', ':v', 'O:\\)', 'O:-\\)', '<3', ':\'\\(', ':-D', ':D', '=D', '8-\\|', '8\\|', 'B-\\|', 'B\\|', ';-\\)',
            ';\\)', ':-&', ':&', ':-O', ':O', ':-o', ':o', '3:\\)', '3:-\\)', ':-/', ':/', ':-\\\\', ':\\\\',
            '\\[\\[f9.rainbow\\]\\]', '\\[\\[f9.cake\\]\\]', '\\[\\[f9.coffee\\]\\]', '\\[\\[f9.gift\\]\\]',
            '\\[\\[f9.bomb\\]\\]', '\\[\\[f9.clap\\]\\]', '\\[\\[f9.sleepy\\]\\]', '\\[\\[f9.stary\\]\\]',
            '\\[\\[f9.heartbreak\\]\\]', '\\[\\[f9.inlove\\]\\]'
        ];

        /*
         FOR TESTING PURPOSES (paste it in the chat window)

         :) :-) :( :-(
         8-) 8) B-) B) :-P :P :-p :p =P =p o.O O.o :v O:)
         O:-) <3 :'( :-D :D =D 8-| 8| B-| B| ;-) ;) :-& :& :-O :O :-o :o 3:) 3:-) :-/ :/ :-\ :\
         [[f9.rainbow]] [[f9.cake]] [[f9.coffee]] [[f9.gift]] [[f9.bomb]] [[f9.clap]] [[f9.sleepy]] [[f9.stary]] [[f9.heartbreak]] [[f9.inlove]]
         */

        // generate regex - START
        var regexPattern = '\\B(';

        for (var i in charsForReplacement) {
            regexPattern += '(?:' + charsForReplacement[i] + ')';

            if (i != charsForReplacement.length - 1) {
                regexPattern += '|';
            }
        }

        regexPattern += ')\\B(?!\\w)';
        // generate regex - END

        var regex = new RegExp(regexPattern, 'g');

        return rawText.replace(regex, function(match) {

            var replacement = $.trim(match);

            return match.replace(replacement, replacementMap[replacement]);
        });
    };

我想做的是創建匹配所有表情的正則表達式。 數組charsForReplacement用於創建常規exp。 模式,因為表情符號有時具有在正則表達式模式中為特殊字符的字符。

當表情符號匹配后,將使用replaceMap,然后讀取需要替換的內容。

生成的注冊表 實驗 模式是:

\\ B((?::))|(?::-))|(?::()|(?::-()|(?:8-))|(?:8))|(? :B-))|(?:B))|(?::-P)|(?:: P)|(?::-p)|(?:: p)|(?:= P)| (?:= p)|(?:oO)|(?:Oo)|(?:: v)|(?:O :))|(?:O :-))|(?:<3)| (?::'()|(?::-D)|(?:: D)|(?:= D)|(?:8- \\ |)|(?:8 \\ |)|(? B- \\ |)|(?:B \\ |)|(?:;-))|(?:;))|(?::-&)|(?::&)|(?::-O )|(?:: O)|(?::-o)|(?:: o)|(?:3 :))|(?:3 :-))|(?::-/)|( ?:: /)|(?::-\\)|(?:: \\)|(?:[[f9.rainbow]])|(?? [[[f9.cake]]))((?:[[ f9.coffee]])|(?:[[[f9.gift]])|(?:[[f9.bomb]])|(?:[[f9.clap]]] |(?:[[f9。困]])|(?:[[f9.stary]])|(?:[[f9.heartbreak]])|(?? [[f9.inlove]]))\\ B(?!\\ w)

但這看起來很復雜,但實際上並非如此。 那是因為有很多表情符號可以匹配。

例如,讓我們說我們只想匹配幾個表情符號,例如':)',':P','XD'然后匹配。 實驗 模式如下所示:

\\ B((?::))|(?:: P)|(?:XD))\\ B(?!\\ w)

我需要你的幫助!

您應該擺脫表情符號。 所以:)的正則表達式是:\\)。 否則(::))是不平衡的正則表達式。

我解決了我的問題。 稍微更改正則表達式對我來說很好。 如果javascript支持正則表達式會容易得多,但事實並非如此。

所以我做了一些解決方法。 我將在較小的示例上顯示解決方案,因為完整示例太大。

舊的正則表達式如下:

\B((?::\))|(?::P)|(?:XD))\B(?!\w)

該正則表達式應與:)或:P或XD匹配,后跟至少一個空格字符或字符串的開頭,然后至少跟隨一個空格字符或字符串的結尾。

這些條件很重要,因為我不想匹配這樣的東西:) :)或asdf :)或:)asdf

它必須是清晰的圖釋。

我已經更改了正則表達式,最后我使用正向前行而不是負向前行,刪除了\\ B作為匹配字符串的邊界,並在正則表達式開始時添加了模擬正向后綴的代碼。

(^|\W)((?::\))|(?::P)|(?:XD))(?=(\s|$))

現在一切看起來都很好。 該修復程序將在早上http://starvibes.com上正式投入生產,因此您可以嘗試我們的Facebook聊天(在Facebook登錄后),看看一切都可以在這款出色的音樂網絡播放器上正常運行(甚至更多)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM