Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.08.2017, 04:42
Аспирант
Отправить личное сообщение для Stenli Посмотреть профиль Найти все сообщения от Stenli
 
Регистрация: 25.06.2017
Сообщений: 36

Планирую скрипт подсвечивающий города России в тексте. Нужна наводка
Привет, профессора!

У меня задумка, которую кратко описал в названии темы. В целом подсветка - не единственное, что в планах. Может понадобится и удаление города и его замена другим городом и замена php-вставочкой. Но, пока что будем отталкиваться от подсветки города на странице.

Над чем думаю:
1. В России более 2800 городов. В тексте может быть более 500 слов. По силам ли jQuery оное?
2. Список городов лежит в файле *.txt построчно. Можно ли подцеплять jQuery файл с городами, например в массив его помещать, и сравнивать с текстом?
3. Если в общем-то первые два пункта выполнимы, то как может выглядеть такой код? Например, видимо нужно сравнивать слова из текста и из списка городов по первой букве, потом по второй или как?
4. Если такая мысль не жизнеспособна средствами jQ, тоже сообщите плз.

Спасибо.

UPD:
Приучаю себя к русскому языку: что я сэкономил, написав плз? Лучше напишу приятное слово "пожалуйтса"))

Последний раз редактировалось Stenli, 02.08.2017 в 23:39.
Ответить с цитированием
  #2 (permalink)  
Старый 01.08.2017, 09:21
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,118

Сообщение от Stenli
то как может выглядеть такой код?
Если текст нормальный, т.е. не капслоком писанный, достаточно просто перебрать слова с большой буквы. Далее поиск города и подсветка слова при удачном раскладе...

Почему не используются базы данных для городов? На сервере такое решается без проблем. Т.к. поиск по равенству очень быстрый.
Ответить с цитированием
  #3 (permalink)  
Старый 01.08.2017, 09:23
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,118

Сообщение от Stenli
Если такая мысль не жизнеспособна средствами jQ, тоже сообщите плз.
На клиенте ты ограничен доступной оперативной памятью и быстродействием клиентской машины...
Ответить с цитированием
  #4 (permalink)  
Старый 01.08.2017, 10:54
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,004

Сообщение от Stenli
1. В России более 2800 городов. В тексте может быть более 500 слов. По силам ли jQuery оное?
2. Список городов лежит в файле *.txt построчно. Можно ли подцеплять jQuery файл с городами, например в массив его помещать, и сравнивать с текстом?
по объемам сущие пустяки. Список грузим через аякс, потом создаем по нему Set, или, если требуется поддержка старых ie, просто объект с полями-названиями.

Далее примерно так
var result = text.replace(/[а-яё]+/g, function(name) {
  var isCityName = ...; // тут проверяем вхождение в набор для строки name
  return isCityName ? '<b>' + name + '</b>' : name;
});



Написано из предположения, что все названия - одно слово. Засада в том, что это не так.
Бывают названия через тире, например, Николаевск-на-Амуре, названия с числами (тоже через тире), и, что хуже всего, названия с пробелом, например, Нижний Новгород. Тут надо уже мозги включать.

С пробелами можно опереться на то, что первое слово само по себе не название, а одно из небольшого списка слов - Нижний, Новый, Старый и т.д. (список надо уточнить)

итоговый набросок:

var names = {
  'Магадан': true,
  'Новгород': true,
  'Нижний Новгород': true,
  'Николаевск-на-Амуре': true
};

var text = 'еду в Магадан,\nеду в Новгород,\nеду в Никуда,\nеду в Нижний Новгород,\nеду в Нижний Магадан,\nеду в Николаевск-на-Амуре';

var result = text.replace(/((Нижний|Новый|Старый)\s+)?([а-яё]+(?:-[а-яё]+)*)/ig, function(m, prefix, first, name) {
  if (first && names[first + ' ' + name]) {
    return '<b>' + m + '</b>';
  }
  return names[name] ? (prefix || '') + '<b>' + name + '</b>' : m;
})

alert(result);


"Нижний Магадан" не подсветился "полностью", за неимением в наборе.

-----
Ещё названия могут склоняться. Москва, Москву, Москве и т.д. Если и их надо подсветить, то тут, пожалуй, надо список окончаний в словарь добавлять. Типа, если на "а" заканчивается, то менять последнюю. Если на согласную букву, то добавлять что-то в конец. У городов с тире и с пробелом там свои засады будут.

Но ты справишься. Потому что если не ты, то кто?

Последний раз редактировалось Alexandroppolus, 01.08.2017 в 11:11.
Ответить с цитированием
  #5 (permalink)  
Старый 03.08.2017, 00:34
Аспирант
Отправить личное сообщение для Stenli Посмотреть профиль Найти все сообщения от Stenli
 
Регистрация: 25.06.2017
Сообщений: 36

Сообщение от Alexandroppolus
Но ты справишься. Потому что если не ты, то кто?
Вдохновляет ))

А если добавить в исключения некоторый список?
Ответить с цитированием
  #6 (permalink)  
Старый 03.08.2017, 20:55
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,004

Сообщение от Stenli
А если добавить в исключения некоторый список?
города, которые подсвечивать не надо?это можно.
сейчас проверка сделана так:
names[name]

а будет
!excludes[name] && names[name]


ну или просто, загрузив список имен, повыкидывать оттуда исключения (не добавлять их в names)
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скрипт выделяющий слова в тексте. Что я делаю не так Aleksey140569 Общие вопросы Javascript 7 23.05.2017 14:37
нужна помощь (есть работа) Редирект скрипт для iOS 9+ Возможно на AngularJS dimazap Мобильный JavaScript 1 20.01.2017 18:46