Сбой Javascript RegEx (иногда)

avatar
Melbfella
8 апреля 2018 в 09:36
50
1
0

Я пытаюсь добавить смайлики на свой веб-сайт чата и использую для этого RegExp.

При одних обстоятельствах это работает, а при других нет, и это сводит меня с ума.

Смайлики хранятся в базе данных - я вытаскиваю их через AJAX json и работаю с полученным массивом, заменяя по мере поступления. Вот как выглядит ответ с помощью инструментов F12 Dev:

arrayVisual

Если для emoticon.SymbolShortcut установлено значение ':D', оно работает, но не работает для ':('.

Проблемный смайлик содержит:

emoticon.FileLocation = '<i class="material-icons emoticon" style="font-size:16x;">sentiment_very_satisfied</i>' //Я знаю, что это не расположение файла - неправильное имя объекта :)

emoticon.SymbolShortcut = ':('

var sMarkup;
var strRegEx = '';

var pText ='some text :('

$.each(emoticonArray, function (index, emoticon) {
    strRegEx = emoticon.SymbolShortcut.replace(')', '[)]').replace('(', '[(]');

    var regEx = new RegExp(strRegEx, "gi");

    pText = pText.replace(strRegEx, emoticon.FileLocation);

});

Итак, проблема заключается в том, что замена не работает для комбинации символов ':(', но работает с ':D'.

Я ожидаю, что символы в переменной pText ':(' будут заменены на 'sentiment_very_satisfied', но все, что я получаю, это та же строка, которую я передал, без замены

Заранее спасибо - приветствуются любые предложения. Пожалуйста, сообщите мне, если я могу предоставить дополнительную информацию, чтобы решить эту самую разочаровывающую головоломку.

Источник
Wiktor Stribiżew
8 апреля 2018 в 09:40
1

В чем проблема? «Не получается», «не работает» не помогают. Как это работает? Что вы ожидаете? Предоставьте MCVE (минимальный полный проверяемый пример).

Melbfella
8 апреля 2018 в 09:41
0

Привет, Виктор, проблема в том, что замена не работает для комбинации символов ':(', но работает с ':D'. Я ожидаю, что символы в переменной pText ':(' будут заменены на '<i class ="material-icons emoticon" style="font-size:16x;">sentiment_very_satisfied</i>', но все, что я получаю, — это та же строка, которую я передал, без замены.

Wiktor Stribiżew
8 апреля 2018 в 09:46
0

Попробуйте экранировать специальные символы с помощью coderhelper.com/a/3561711/3832970.

Rizwan M.Tuman
8 апреля 2018 в 09:47
0

@Melbfella, зачем ты 'some text :(' strRegEx = emoticon.SymbolShortcut.replace(')', '[)]').replace('(', '[(]'); это делаешь?

Ответы (1)

avatar
Rizwan M.Tuman
8 апреля 2018 в 09:50
-1

Обновлен ответ с учетом потока OP:

var pText ='some text :('

strRegEx = `:(`.replace(')', '\\)').replace('(', '\\(');
var regEx = new RegExp(strRegEx, "i");
pText = pText.replace(regEx,`<i class="material-icons emoticon" style="font-size:16x;">sentiment_very_satisfied</i>`);
console.log(pText);
Robo Mop
8 апреля 2018 в 10:20
0

Я предполагаю, что минус за то, что не объясняется работа регулярного выражения, но ответ кажется мне довольно ясным.