Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.02.2010, 22:47
Новичок на форуме
Отправить личное сообщение для bibimij Посмотреть профиль Найти все сообщения от bibimij
 
Регистрация: 20.02.2010
Сообщений: 6

Поиск и замена строк с кириллическими символами
Подскажите, пожалуйста.
Делаю плагин 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');


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

Последний раз редактировалось bibimij, 21.02.2010 в 00:34. Причина: вставил коды для повышения читабельности
Ответить с цитированием
  #2 (permalink)  
Старый 21.02.2010, 01:44
Кандидат Javascript-наук
Отправить личное сообщение для vk65535 Посмотреть профиль Найти все сообщения от vk65535
 
Регистрация: 21.11.2008
Сообщений: 114

У вас в выражении используется спецсимвол \b (граница слова). Реги к сожалению не знают национальных алфавитов, и совпадение всегда будет ложным (как и в случае с \w).
Ответить с цитированием
  #3 (permalink)  
Старый 21.02.2010, 14:40
Новичок на форуме
Отправить личное сообщение для bibimij Посмотреть профиль Найти все сообщения от bibimij
 
Регистрация: 20.02.2010
Сообщений: 6

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

На вскидку, там отсекаются теги и что
Ответить с цитированием
  #4 (permalink)  
Старый 21.02.2010, 19:22
Кандидат Javascript-наук
Отправить личное сообщение для vk65535 Посмотреть профиль Найти все сообщения от vk65535
 
Регистрация: 21.11.2008
Сообщений: 114

И последовательности, типа &nbsp;
Ответить с цитированием
  #5 (permalink)  
Старый 22.02.2010, 00:12
Новичок на форуме
Отправить личное сообщение для bibimij Посмотреть профиль Найти все сообщения от bibimij
 
Регистрация: 20.02.2010
Сообщений: 6

Но, по документации, конструкция x(?!y) находит x, если за x не следует y.
Чем является x в первой скобке (?![^&;]+; )?
Ответить с цитированием
  #6 (permalink)  
Старый 22.02.2010, 01:43
Новичок на форуме
Отправить личное сообщение для bibimij Посмотреть профиль Найти все сообщения от bibimij
 
Регистрация: 20.02.2010
Сообщений: 6

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

Последний раз редактировалось bibimij, 22.02.2010 в 01:58.
Ответить с цитированием
  #7 (permalink)  
Старый 22.02.2010, 02:25
Новичок на форуме
Отправить личное сообщение для bibimij Посмотреть профиль Найти все сообщения от bibimij
 
Регистрация: 20.02.2010
Сообщений: 6

Да, действительно, работает как надо.
Ответить с цитированием
  #8 (permalink)  
Старый 25.02.2010, 09:16
Кандидат Javascript-наук
Отправить личное сообщение для Бобр Посмотреть профиль Найти все сообщения от Бобр
 
Регистрация: 03.11.2008
Сообщений: 116

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

Проблема в том, что если пользователь введёт символ "/" или "[" или ещё какой-то, то это будет воспринято как спецсимвол регулярного выражения, а мне не нужно этого ничего. Нужно просто заменить один текст на другой. Как это можно сделать?
Ответить с цитированием
  #9 (permalink)  
Старый 25.02.2010, 13:19
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

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

RegExp.escape = function(str) {
	return (str + '').replace(/([?!^$.(){}:|=[\]+\-\/\\*])/g, '\\$1');
};
Ответить с цитированием
  #10 (permalink)  
Старый 26.02.2010, 04:53
Кандидат Javascript-наук
Отправить личное сообщение для Бобр Посмотреть профиль Найти все сообщения от Бобр
 
Регистрация: 03.11.2008
Сообщений: 116

Сообщение от Riim
RegExp.escape = function(str) {
return (str + '').replace(/([?!^$.(){}:|=[\]+\-\/\\*])/g, '\\$1');
};
А как этим воспользоваться?

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск текста и замена krestiyaninov Общие вопросы Javascript 1 07.05.2008 13:30