Не работает с кириллицей.

Evg

Гуру форума
Регистрация
3 Авг 2006
Сообщения
141
Реакции
51
Какие есть идеи о том, как переписать?

Код:
censorRegexp = new RegExp("(\\b(?:(hello)|(Здравствуйте))\\b)(?![^\\(]*\\))", "ig");

Скрытое содержимое доступно для зарегистрированных пользователей!


Заранее благодарен.
 
Последнее редактирование:

lag

Мой дом здесь!
Регистрация
13 Окт 2014
Сообщения
290
Реакции
359
Метасимвол \b обозначает границу слова, а в JavaScript к слову \w относятся символы [a-zA-Z0-9_] так что для кирилицы \b не работает.
Проверить границу слова можно так (^|[^\wА-ЯЁ]) и (?![\wА-ЯЁ]).

Исходный фрагмент
Код:
    try {
      censorRegexp = new RegExp("(\\b(?:" + patterns.join("|") + ")\\b)(?![^\\(]*\\))", "ig");

      if (censorRegexp) {

        return function(text) {
          let original = text;

          try {
            let m = censorRegexp.exec(text);

            while (m && m[0]) {
              if (m[0].length > original.length) { return original; } // regex is dangerous
              const replacement = new Array(m[0].length+1).join(replacementLetter);
              text = text.replace(new RegExp(`(\\b${escapeRegexp(m[0])}\\b)(?![^\\(]*\\))`, "ig"), replacement);
              m = censorRegexp.exec(text);
            }

            return text;
          } catch (e) {
            return original;
          }
        };
Исправить на такой
Код:
    try {
      censorRegexp = new RegExp("(^|[^\wА-ЯЁ])(?:" + patterns.join("|") + ")(?![\wА-ЯЁ])(?![^\\(]*\\))", "ig");

      if (censorRegexp) {

        return function(text) {
          let original = text;

          try {
        
            text = text.replace(
                censorRegexp,
                function(m0, m1) {
                    return m1 + new Array(m0.length - m1.length + 1).join(replacementLetter);
                });
      
            return text;
          } catch (e) {
            return original;
          }
        };
 
Последнее редактирование:

Evg

Гуру форума
Регистрация
3 Авг 2006
Сообщения
141
Реакции
51
Этот вариант не подойдет. Замены A-Я... Alnum предлагал, они пишут что это частные случаи. Замену b - предлагал, оригинальный пост:

This does not look like a regression, I think it never worked:
This regex4 does not work with Cyrillic .
Anyone have any ideas on how to rewrite:
censorRegexp = ну и т.д.
So it does not use \b which is unsupported Russian.
(be sure to reply here with a tested regex I have already seen the posts on Stack Overflow)

Это все пишет разработчик Stack Overflow, и его владелец. Что-то видимо не просто. Они не "дергаются" т.к. для англ. аудитории проблем нет. А быстрое решение для многоязычной аудитории их не устраивает... Вот почему везде и спрашиваю... На всех форумах.
 
Последнее редактирование:

lexaz44

Создатель
Регистрация
21 Мар 2017
Сообщения
10
Реакции
0
C utf-8 не заработает. Если только предварительно конвертировать в cp-1251, там обрабатывать и обратно в utf-8. Извращение, но работает
 

Evg

Гуру форума
Регистрация
3 Авг 2006
Сообщения
141
Реакции
51
C utf-8 не заработает. Если только предварительно конвертировать в cp-1251, там обрабатывать и обратно в utf-8. Извращение, но работает
Однозначно должен быть способ универсальный. Представлены языки и китайский, персидский и т.д. Т.е. надо универсальный метод... Пока отложили это.
 
Сверху