0

顔文字のキーの組み合わせに一致する JavaScript 関数を実装し、スパンと特定の 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 を作成するために使用されます。顔文字には、正規表現パターンの特殊文字である文字が含まれていることがあるためです。

replacementMap は、emoticn が一致したときに使用され、置き換えが必要なもので読み取られます。

生成されたreg。指数 パターンは次のとおりです。

\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.虹]])|(?:[[f9.ケーキ]])|(?:[[ f9.coffee]])|(?:[[f9.gift]])|(?:[[f9.bomb]])|(?:[[f9.clap]])|(?:[[f9.眠い]])|(?:[[f9.stary]])|(?:[[f9.失恋]])|(?:[[f9.inlove]]))\B(?!\w)

しかし、複雑に見えますが、実際にはそうではありません。これは、一致する可能性のある絵文字がたくさんあるためです。

しかし、たとえば、':)'、':P'、'XD' などのいくつかの絵文字だけに一致させたいとします。指数 パターンは次のようになります。

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

皆さんの助けが必要です!

4

2 に答える 2

0

絵文字をエスケープする必要があります。したがって、:) の正規表現は :\) です。それ以外の場合 (::)) は、バランスの取れていない正規表現です。

于 2013-09-11T16:49:20.437 に答える