Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Поиск и замена строк с кириллическими символами (https://javascript.ru/forum/misc/7822-poisk-i-zamena-strok-s-kirillicheskimi-simvolami.html)

bibimij 20.02.2010 22:47

Поиск и замена строк с кириллическими символами
 
Подскажите, пожалуйста.
Делаю плагин autocomplete к jQuery. Не получается сделать проверку на вхождение и замену в строках с символами кириллицы.
Делаю так:
var re = new RegExp('\\b'+text,'gi');
if(str.search(re))
 str.replace(re,'<strong>$1</strong>');

где str — текст текущего элемент списка (в цикле обхожу все элементы),
text — это текст, содержащийся в поле ввода, т.е. подстрока.
С латиницей получается, с кириллицей — нет.

Нашёл примерчик регулярного выражения из готового плагина. Сработало! Объясните его, пожалуйста.
var re = new RegExp("(?![^&;]+;)(?!<[^<>]*)("+text+")(?![^<>]*>)(?![^&;]+;)",'gi');


Интересует само содержимое выражения.

vk65535 21.02.2010 01:44

У вас в выражении используется спецсимвол \b (граница слова). Реги к сожалению не знают национальных алфавитов, и совпадение всегда будет ложным (как и в случае с \w).

bibimij 21.02.2010 14:40

Хм.
Но ведь готовые autocomplete'ы правильно выделяют слова по регулярным выражениям.
Я не могу понять второго регулярного выражения, которое я нашёл в одном из таких контекстных поисков:
var re = new RegExp("(?![^&;]+;)(?!<[^<>]*)("+text+")(?![^<>]*>)(?![^&;]+;)",'gi');

На вскидку, там отсекаются теги и что

vk65535 21.02.2010 19:22

И последовательности, типа &nbsp;

bibimij 22.02.2010 00:12

Но, по документации, конструкция x(?!y) находит x, если за x не следует y.
Чем является x в первой скобке (?![^&;]+; )?

bibimij 22.02.2010 01:43

Я, кажется, составил подходящую комбинацию и она оказалась неприлично проста:
var re = new RegExp('(^| |\\()('+text+')','i');
if(str.search(re))
 str.replace(re,'$1<strong>$2</strong>');

bibimij 22.02.2010 02:25

Да, действительно, работает как надо.

Бобр 25.02.2010 09:16

Скажите, пользователь вводит слово с клавиатуры, как это слово найти и заменить в имеющемся тексте?

Проблема в том, что если пользователь введёт символ "/" или "[" или ещё какой-то, то это будет воспринято как спецсимвол регулярного выражения, а мне не нужно этого ничего. Нужно просто заменить один текст на другой. Как это можно сделать?

Riim 25.02.2010 13:19

Цитата:

Сообщение от Бобр
Проблема в том, что если пользователь введёт символ "/" или "[" или ещё какой-то, то это будет воспринято как спецсимвол регулярного выражения

Экранировать символом "\".

RegExp.escape = function(str) {
	return (str + '').replace(/([?!^$.(){}:|=[\]+\-\/\\*])/g, '\\$1');
};

Бобр 26.02.2010 04:53

Цитата:

Сообщение от Riim
RegExp.escape = function(str) {
return (str + '').replace(/([?!^$.(){}:|=[\]+\-\/\\*])/g, '\\$1');
};

А как этим воспользоваться?

Неужели в javascript нет родных функций замены без регулярных выражений? Ведь если сначала добавлять слёш, а потом обрабатывать регулярными выражениями, то скорости программе это совсем не добавляет.


Часовой пояс GMT +3, время: 03:38.