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

Сообщение от 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.
Ответить с цитированием