Попробуйте что-то вроде:
RewriteRule /404.html - [L,R=404]
Вполне вероятно что приведет к зацикленному редиректу, тогда удалите строку и отпишитесь.
Да, но дистанция в 1-3 символ - не много. Можно считать, что это искомое слово. Хотя, конечно, нужно брать контекст. Тут все зависит от фонетического разбора: чем он точнее разбирает произношение слов, тем ниже ошибка. Можно звонкие на глухие менять, и гласные не убирать, тогда точность высится. В любом случае, это более точный алгоритм, чем доверится на правильное написание города пользователем.
Вообще интересная темка, я давно хотел написать кое-какую штуку на эту тему: что-то вроде мини-поисковой системы, которая бы оценивала релевантность слова. Но пока руки не доходят, и не уверен что доведу до конца.
P.S. [umka], ваш ник ломает систему быстрого цитирования :)
Ну у меня там несколько запросов в базу, пара к Redis, +парсинг и отдача шаблона. Не скажу, что прям ваще ресурсоемкое, но аналогичное на PHP7 с Twig и тем же Redis работает в 2.5 раза медленнее.
Первое решение было на Go, веб-сервер тоже асинхронный на Go отдающий статику.
Второе было Nginx, php7.0-fpm.
Конечно, все от кода и приложения зависит, но я к тому, что 30к в сутки, это 1 запрос в секунду при 8 часовом рабочем графике. Обычно график более размазан. 1 запрос в секунду - это не нагрузка.
Нет никакого смысла приводить к базовой форме. Достаточно просто находить дистанцию между словами. Например: Между "Москва" и "Москве" дистанция 1 символ: "а" меняется на "е". Между "Москва" и "Моксва" - 2 символа. Предварительно, можно сделать фонетический разбор слова, есть множество алгоритмов, но не все они подходят под русский, если вкратце, то пропущенное через функцию фонетического разбора слово "Ростов-на-Дону" будет выглядеть где-то так: РСТВНДН, и даже если мы его просклоняем - слово не изменится, т.к. гласные из слова убраны, а если и слово не меняется - значит расстояние между двумя словами будет равно 0 - а это значит точное попадание. Это конечно лучше чем милторговские алгоритмы, но не идеально ввиду того, что если слово напишут "Ростов на дону" (вместо тире - пробелы), то регулярка по тире может не сработать, ну и ещё по мелким косячкам, которые сработают: например город "Обь" и слово "об" пропущенные через функцию фонетического разбора будут выглядеть как "б", что является полным совпадением с точки зрения дистанции между словами.
Я как-то раз писал алгоритм, который учитывал ошибки пользователей в поисковых запросах. Удобно, с учетом автодополнения и автозамены при подтверждении.
Так это я вас обучаю. Если регулярка заключается в том, чтобы убрать последнюю букву у слова, типа "Москв", то да, прокатит. Для склонения слова Москва. Но не прокатит для склонения, например, Ростова-на-Дону. Ваша регулярка не сработает на "Ростов-на-Дон" в случае, если Петя решит отпраздновать Новый год в Ростове-на-Дону.
Какая? Название города без последней буквы?
Город Москва, как и москва, существует. Просто допущена ошибка в написании. Страшно представить что было-бы, если бы вы писали поисковый алгоритм Google.
- кинотеатры казани
- 0 результатов---------- Добавлено 13.12.2016 в 19:51 ----------
Так а я и не говорю что он мудак, просто задачка для мозга: как разбирать морфологию и определять опечатки в словах. Молодец что помог, безусловно.
miltorg, при том, что если в базе появится +500 городов, вы на каждый напишете регулярку?
...
preg_match('москв', $text)
preg_match('казан', $text)
Ваше: http://prntscr.com/diz0xe
И даже так: http://prntscr.com/diz93x
Должно: http://prntscr.com/diz88n
И даже так должно: http://prntscr.com/diz9k8
Исходник продам за 20 баксов. :)
Что работает? Там netgoroda написано. Москва и Москве - два разных города по вашему?
Для того, чтобы определялись склонения, нужно писать что-то вроде метафон-функции и высчитывать дистанцию между словами (левенштайн). Все остальное (preg_match, strpos, etc.) - как авторизация только по логину. Идиотизм другими словами.