Планирую скрипт подсвечивающий города России в тексте. Нужна наводка
Привет, профессора!
У меня задумка, которую кратко описал в названии темы. В целом подсветка - не единственное, что в планах. Может понадобится и удаление города и его замена другим городом и замена php-вставочкой. Но, пока что будем отталкиваться от подсветки города на странице. Над чем думаю: 1. В России более 2800 городов. В тексте может быть более 500 слов. По силам ли jQuery оное? 2. Список городов лежит в файле *.txt построчно. Можно ли подцеплять jQuery файл с городами, например в массив его помещать, и сравнивать с текстом? 3. Если в общем-то первые два пункта выполнимы, то как может выглядеть такой код? Например, видимо нужно сравнивать слова из текста и из списка городов по первой букве, потом по второй или как? 4. Если такая мысль не жизнеспособна средствами jQ, тоже сообщите плз. Спасибо. UPD: Приучаю себя к русскому языку: что я сэкономил, написав плз? Лучше напишу приятное слово "пожалуйтса")) |
Цитата:
Почему не используются базы данных для городов? На сервере такое решается без проблем. Т.к. поиск по равенству очень быстрый. |
Цитата:
|
Цитата:
Далее примерно так 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); "Нижний Магадан" не подсветился "полностью", за неимением в наборе. ----- Ещё названия могут склоняться. Москва, Москву, Москве и т.д. Если и их надо подсветить, то тут, пожалуй, надо список окончаний в словарь добавлять. Типа, если на "а" заканчивается, то менять последнюю. Если на согласную букву, то добавлять что-то в конец. У городов с тире и с пробелом там свои засады будут. Но ты справишься. Потому что если не ты, то кто? |
Цитата:
А если добавить в исключения некоторый список? |
Цитата:
сейчас проверка сделана так: names[name] а будет !excludes[name] && names[name] ну или просто, загрузив список имен, повыкидывать оттуда исключения (не добавлять их в names) |
Часовой пояс GMT +3, время: 10:03. |