Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Планирую скрипт подсвечивающий города России в тексте. Нужна наводка (https://javascript.ru/forum/jquery/69979-planiruyu-skript-podsvechivayushhijj-goroda-rossii-v-tekste-nuzhna-navodka.html)

Stenli 01.08.2017 04:42

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

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

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

Спасибо.

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

ksa 01.08.2017 09:21

Цитата:

Сообщение от Stenli
то как может выглядеть такой код?

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

Почему не используются базы данных для городов? На сервере такое решается без проблем. Т.к. поиск по равенству очень быстрый.

ksa 01.08.2017 09:23

Цитата:

Сообщение от Stenli
Если такая мысль не жизнеспособна средствами jQ, тоже сообщите плз.

На клиенте ты ограничен доступной оперативной памятью и быстродействием клиентской машины...

Alexandroppolus 01.08.2017 10:54

Цитата:

Сообщение от 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);


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

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

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

Stenli 03.08.2017 00:34

Цитата:

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

Вдохновляет ))

А если добавить в исключения некоторый список?

Alexandroppolus 03.08.2017 20:55

Цитата:

Сообщение от Stenli
А если добавить в исключения некоторый список?

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

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


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


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