Сообщение от 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);
"Нижний Магадан" не подсветился "полностью", за неимением в наборе.
-----
Ещё названия могут склоняться. Москва, Москву, Москве и т.д. Если и их надо подсветить, то тут, пожалуй, надо список окончаний в словарь добавлять. Типа, если на "а" заканчивается, то менять последнюю. Если на согласную букву, то добавлять что-то в конец. У городов с тире и с пробелом там свои засады будут.
Но ты справишься. Потому что если не ты, то кто?