[LJ2ME] Уехал на море!
У меня начался отпуск , товарищи, и я уехал на море в Адлер и Сочи. О своих передвижениях пишу в твиттер.
http://twitter.com/gv0zdik
http://twitter.com/gv0zdik
- Нахожусь:Адлер
Сегодня натягивал макет дизайна на движек Modx и заметил, что в большинстве стандартных шаблонов отсутствуют META теги keywords и description. А в теге title используется стоп символ "|" т.е. титл выглядит как "Название сайта | Название страницы" - это не есть хорошо. А мы все хотим что бы сайт хорошо индексировался, так что исправляем в шаблонах титл и добавляем мета теги таким образом.
<title>[*pagetitle*]</title>
<meta name="description" content="[*description*]" />
<meta name="keywords" content="[*introtext*]" />
Теперь при создании документа Заголовок будет титлом , Аннотация (введение) будет вставляться в тег keywords , а описание в тег description. Вот так

<title>[*pagetitle*]</title>
<meta name="description" content="[*description*]" />
<meta name="keywords" content="[*introtext*]" />
Теперь при создании документа Заголовок будет титлом , Аннотация (введение) будет вставляться в тег keywords , а описание в тег description. Вот так
Я в итоге нашел классного дизайнера для того, что бы работать в команде и того нас уже трое- я,дизайнер и копирайтер. В скором будущем нужен будет ещё и СЕОшник грамотный. В данный момент все занимаемся созданием сайта и организацией работы , как все заработает обязательно похвастаюсь.
Моя жжшчка за предыдущий пост заработала первые три бакса, злоупотреблять не собираюсь
Аналитический портал «CMS Magazine» подвел итоги первого ежеквартального опроса среди профессиональных участников рынка веб-разработок (http://research.cmsmagazine.ru).
В первом опросе приняло участие 227 веб-студий, т. е. около 16% от общего числа компаний, зарегистрированных на проекте «CMS Magazine». Топ-менеджерам веб-студий было задано 12 вопросов. Формат ответов давал возможность рассказать о ситуации в 2008-м году, в 1-м квартале 2009-го и сделать прогноз на 2-й квартал этого года.
Публикуются только обобщенные показатели, сегментированные по регионам, и комментарии руководителей веб-студий.
Клиенты могут получить информацию о том, какова средняя стоимость и срок разработки корпоративного сайта в Москве, Санкт-Петербурге и других регионах, и ответы на другие важные для них вопросы. Профессиональные участники рынка также найдут необходимую для них аналитическую информацию.
Результаты исследования сопровождаются публичными комментариями представителей веб-студий.
Среди принявших участие в опросе и оставивших комментарии, такие компании, как: «Actis Systems», «Articul Media», «DEFA Interaktiv», «Dot», «X-Project», «Grape», «Аист», «Атилект», «Бизнес Реклама» и многие другие компании.
стоимость создания сайта
Для удобства, редакция «CMS Magazine» зарегистрировала еще один домен: http://www.webindicator.ru/, который является "зеркалом" инструмента аналитики.
В первом опросе приняло участие 227 веб-студий, т. е. около 16% от общего числа компаний, зарегистрированных на проекте «CMS Magazine». Топ-менеджерам веб-студий было задано 12 вопросов. Формат ответов давал возможность рассказать о ситуации в 2008-м году, в 1-м квартале 2009-го и сделать прогноз на 2-й квартал этого года.
Публикуются только обобщенные показатели, сегментированные по регионам, и комментарии руководителей веб-студий.
Клиенты могут получить информацию о том, какова средняя стоимость и срок разработки корпоративного сайта в Москве, Санкт-Петербурге и других регионах, и ответы на другие важные для них вопросы. Профессиональные участники рынка также найдут необходимую для них аналитическую информацию.
Результаты исследования сопровождаются публичными комментариями представителей веб-студий.
Среди принявших участие в опросе и оставивших комментарии, такие компании, как: «Actis Systems», «Articul Media», «DEFA Interaktiv», «Dot», «X-Project», «Grape», «Аист», «Атилект», «Бизнес Реклама» и многие другие компании.
стоимость создания сайта
Для удобства, редакция «CMS Magazine» зарегистрировала еще один домен: http://www.webindicator.ru/, который является "зеркалом" инструмента аналитики.
[LJ2ME] Пробный пост lj2me
Сегодня на свой телефон nokia e51 поставил клиент для жж под названием lj2me, поэтому и пишу я этот пост, дабы попробывать. На самом деле был немного огорчен в плане функционала, кроме того как просто писать в жж , клиент больше ничего не умеет. Т.к. других подобных приложений под 9 симбиан не нашел рад и этому, в принципе с написанием постов справляется на 100%. Сайт разработчиков и ссылка на скачку последний версии.
- Нахожусь:На кухне
Решил в интернете развернуть веб-студию , принимать заказы на создание и продвижение сайтов. В плане программирования проблем никаких нет , есть я и ещё один человек. Все что нужно наверстаем и подвесим на любую CMS систему или свою напишем, в зависимости от бюджета. С продвижением тоже особых трудностей нет , хотя в дальнейшем и сеошник грамотный нужен будет. В данный момент нужен ответственный дизайнер или даже несколько дизайнеров , на которых можно положиться. Если такие имеются и готовы начать работать вместе , отпишитесь в комментах или личку. Приблизительные расценки на дизайн одной странички , от 7000 - 15000 р. в зависимости от количества элементов , которые дизайнеру предстоит нарисовать самому.
Т.е. страницы наподобие этих
http://www.tehprom.ru/
http://www.skportal.ru/
Будут оцениваться явно больше 12 тыр ибо , на них много изображений нарисованных дизайнером с нуля или лихо обработынных фотографий, ну то есть видно что человек заморочился )) Так же хотелось, что бы этот же дизайнер мог делать более бюджетные проекты от 7 до 10 тыр , т.е. просто обычный дизайн типа этого
http://www.litkomtula.ru/
одна фотография с фотостока и аккуратно оформленные категории и разделы сайта , для менее денежных заказчиков. Общение с дизайнером будет осуществляться по средствам скайпа и любого интернет мессенджера , так что кому интересно пишите.
Т.е. страницы наподобие этих
http://www.tehprom.ru/
http://www.skportal.ru/
Будут оцениваться явно больше 12 тыр ибо , на них много изображений нарисованных дизайнером с нуля или лихо обработынных фотографий, ну то есть видно что человек заморочился )) Так же хотелось, что бы этот же дизайнер мог делать более бюджетные проекты от 7 до 10 тыр , т.е. просто обычный дизайн типа этого
http://www.litkomtula.ru/
одна фотография с фотостока и аккуратно оформленные категории и разделы сайта , для менее денежных заказчиков. Общение с дизайнером будет осуществляться по средствам скайпа и любого интернет мессенджера , так что кому интересно пишите.
Сколько не выбирал CMS систему для нового проекта , так и остановился на Drupal'e. На самом деле система далеко не для новичков , точнее новичкам будет очень легко навернуть её с помощью плагинов и модулей , тему какую-нибудь публичную поставить и радоваться , а вот в свой дизайн drupal 6 заковать очень тяжело. Например, чтобы переделать дизайн формы авторизации, пришлось написать свой блок и без помощи Form API ,а тупым выводом HTML кода , где все компоненты формы будут расставлены и оформлены как я хочу , а не так как диктует генератор форм друпала. Может быть кто подскажет, как элементы формы вписать в табличку , может быть плагин какой-нибудь есть или хитрость какая )? Порадовали модули taxonomy,CCK и VIEWS , очень гибкий инструмент позволяющий творить с контентом сайта всё что угодно. Создавать дополнительные поля любого типа , структурировать данные и настраивать отображение списков информации. Сейчас запускаю на друпале мощную доску объявлений , на следующей недели уже проект заработает , обязательно вам о нем расскажу и покажу.
tamplete.tpl.php
<h1><? NewsTitleList() ?></h1>
К таким системам можно отнести Drupal , WordPress, HostCMS, 1C-Bitrix и т.д. , как правило они все храмают на ногу в плане интеграции с дизайном. Тоесть нет не одного проекта на друпале , по внешнему виду которого вы бы его могли перепутать с другой системой. Возьмём самый раскрученный проект на друпале webplanet.ru , по главной странице ничего не скажешь , но стоит нам открыть форму авторизации и сразу понятно что это Друпик ) ,я сам с этим сталкивался у него не реально переделать любую форму кроме как через CSS, а это мне кажеться большой минус.
Вторая группа систем реализована на TPL шаблонах , к ним можно отнести DLE, phpBB и другие. Эти системы легко ложатся под уникальный дизайн , скрипты только обрабатывают переменные и массивы , а вывод контролирует шаблонизатор. Вроде бы все отлично , кроме одного "НО" , очень затруднительное расширение функционала и реализуется оно с помощью "хаков" , тоесть простой замены кода на новый.
Так вот о друпале , из-за легкой расширяемости у друпала появилось много поклонников. Есть несколько русскоязычных книг , тысячи всевозможных плагинов и модулей, сотни тем оформления и ещё куча всего. У друпала есть очень мощный механизм для создания собственных форм , так называемый Forms API (подробнее тут) , только вот это и плюс и минус одновременно )) С помощью Forms API , можно интегрировать в систему форму любой сложности за несколько минут , не задумываясь о выводе ошибок и обработки входящих данных, но на отображение формы повлиять вы никак не сможите , кроме как через CSS, а это не вариант. Ещё порадовало то, что на любой вопрос можно найти ответ на сайтах сообщества. По моему система отлично подойдёт для не комерческих проетов , сообществ и блогов, но что-то уникальное на ней не сделаешь.
Сегодня весь день искал функцию которая очистит код интернет страничек и выдаст на выходе только смысловой текст со знаками препинания , без всяких там html, javascript и прочих тегов. Т.е. на подобие strip_tags() , но только что бы умела вырезать ещё и яваскрипт и прочие конструкции. Так и не найдя функцию , решил написать на нескольких форумах:
http://php.ru/forum/viewtopic.php?t=1637 7
http://phpclub.ru/talk/showthread.php?s= &threadid=112506&rand=1
После того как ответа не дождался написал ещё в сообществе и форуме )
http://forum.vingrad.ru/forum/topic-2447 81.html
http://community.livejournal.com/ru_php/1 314801.html
В итоге функцию подсказали в сообществе ru_php , пользователь
eznab , огромное ему спасибо.
Функция называется strip_tags_smart() , вырезает всё кроме смыслового текста , описание и сама функция здесь , всем брать на вооружение )) .
http://php.ru/forum/viewtopic.php?t=1637
http://phpclub.ru/talk/showthread.php?s=
После того как ответа не дождался написал ещё в сообществе и форуме )
http://forum.vingrad.ru/forum/topic-2447
http://community.livejournal.com/ru_php/1
В итоге функцию подсказали в сообществе ru_php , пользователь
Функция называется strip_tags_smart() , вырезает всё кроме смыслового текста , описание и сама функция здесь , всем брать на вооружение )) .
Для тех кто впервые слышит сочетание слов Symfony Framework , советую посмотреть этот видео ролик, лично я был очень впечатлён.
http://www.symfony-project.org/screencas
Про Symfony я узнал наверное года два-три назад , поковырялся немного и забросил эту затею. На тот момент система была плохо документирована , на русском языке вообще документация отсутствовала и мало людей занимались разработкой на symfony. Сегодня многое поменялось у symfony появилась толпа поклонников , соответственно и все остальное. Ниже приведу ссылки на блоги , сообщества и форумы посвященные фреймворку. Я не пропагандирую и не призываю всех пересаживаться на Symfony т.к. сам вообще не пишу на фреймворках , но внимания и уважения проект заслуживает.
Ссылки по теме:
http://www.symfony-project.org/ - сайт проекта
http://www.symfony-project.org/book/1_0/
http://trac.symfony-project.org/wiki/Doc
http://translated.by/you/tags/symfony/ - корявый перевод на русский )
http://ru.wikipedia.org/wiki/Symfony - Википедия
http://developer.co.ua/posts/view/symfon
Русскоязычные блоги и сообщества:
http://habrahabr.ru/blogs/symfony/
http://symfony.org.ua/
http://symfony.artsofte.ru/
http://tigor.com.ua/blog/
http://451f.com.ua/
Другие блоги:
http://www.symfony-framework.com/
http://www.thatsquality.com/section-name/s
Извиняюсь что давно не писал , как то душа не лежала и лень было. В этом посте хотелось написать про очень актуальную на сегодняшний день технологию OpenID. Точнее собрать всё в кучу и ещё раз пояснить для чего это нужно.
С каждым днём всё труднее и труднее заставить посетителей сайта или блога пройти регистрацию (тем более если нужно активировать аккаунт через email) , с целью оставить несколько комментариев или получить доступ к дополнительным возможностям проекта. Так вот в этом случае нам на помощь и приходит технология OpenID , посетителям не нужно будет проходить регистрацию, а всего лишь указать URL сервиса в котором у вас есть OpenID аккаунт (ЖЖ тоже подойдет , т.к. является именно таким сервисом) и подтвердить авторизацию по OpenID. Подробнее про технологию читаем на википедии не буду повторяться.
Так что плюсов массу , теперь подробнее про то что читать и как прикрутить. Самая популярная библиотека на php считаеться PHP OpenID Library поможет вам организвовать как и аутентификацию по OpenID , так и самим раздавать учетные записи , то есть стать провайдером OpenID. Тут описано как заставить эту библиотеку работать и прикрутить =). И вот ещё одна статья про эту же библиотеку. Если вам нужна одна авторизация по OpenID, то предлагаю воспользоваться более простым скриптиком , код здесь , демо тут , описание тоже есть. А вообще библиотек достаточно и на PHP и на Python , один phpclasses.org на запрос OpenID выдаёт три страницы наработок и классов.
Для многих популярных CMS и Framework'ов уже есть модули и плагины , ну это уже для совсем ленивых:
http://wordpress.org/extend/plugins/open id/ - плагин для WordPress
http://symfony-project.org/plugins/sfOpe nIDExtPlugin - плагин для symfony framework и описание как прикрутить на русском
http://drupal.org/project/openid - плагин для Drupal
Очень классную форму авторизации можно посмотреть тут (справа), пользователи видят знакомые значки и сами допирают для чего нужен OpenID и проходят авторизацию, а то 80% посетителей и слов таких страшных не слышали.
Так что плюсов массу , теперь подробнее про то что читать и как прикрутить. Самая популярная библиотека на php считаеться PHP OpenID Library поможет вам организвовать как и аутентификацию по OpenID , так и самим раздавать учетные записи , то есть стать провайдером OpenID. Тут описано как заставить эту библиотеку работать и прикрутить =). И вот ещё одна статья про эту же библиотеку. Если вам нужна одна авторизация по OpenID, то предлагаю воспользоваться более простым скриптиком , код здесь , демо тут , описание тоже есть. А вообще библиотек достаточно и на PHP и на Python , один phpclasses.org на запрос OpenID выдаёт три страницы наработок и классов.
Для многих популярных CMS и Framework'ов уже есть модули и плагины , ну это уже для совсем ленивых:
http://wordpress.org/extend/plugins/open
http://symfony-project.org/plugins/sfOpe
http://drupal.org/project/openid - плагин для Drupal
Очень классную форму авторизации можно посмотреть тут (справа), пользователи видят знакомые значки и сами допирают для чего нужен OpenID и проходят авторизацию, а то 80% посетителей и слов таких страшных не слышали.
Не многим позже хочу написать пост о себе , а то как то неправильно получается , что я ещё не представился перед читателями ) Раньше смысла в этом посте особо не было , а сейчас уже может кому-нибудь будет интересно кто я , чем занимаюсь и чем занимался ;)
В этом посте опишу алгоритм поиска с учётом русской морфологии и релевантности , ещё поиск будет индексируемым, что увеличит скорость выдачи результатов. Морфология будет бессловарная , а именно алгоритм Портера о котором я писал в предыдущих постах. Индексация будет выполняться следующим образом , мы создадим специальную табличку где будут храниться URL'лы страниц их текст и словоформы этого текста. При добавлении и редактировании контента сайта, нужно будет изменять данные в табличке поисковика вызывая эту функцию. Тем самым какой бы не был у нас объект данные о нем будут лежать в одной табличке , а не раскиданы по всей базе , что увеличит скорость поиска в разы. Не буду подробно описывать весь алгоритм , а остановлюсь чисто на некоторых моментах , которые у вас дорогие читатели могут вызвать затруднения.
Поисковая табличка
В таблицу поискового индекса мы будем записывать url страницы , дату создания (я записываю в формате unix_time , поэтому и int(11)) , текс объекта без изменения и словоформы текста , без знаков препинания и лишних символов.
У меня получился такой дамп:
CREATE TABLE `seach_index` (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
`url` varchar(200) NOT NULL,
`page_text` text NOT NULL,
`date` int(11) NOT NULL,
`page_words_index` text NOT NULL,
FULLTEXT (`page_text`,`page_words_index`)
) ENGINE=MyISAM;
Чистим текст
Прежде чем пихать новости и страницы в поисковую табличку, их нужно очистить от тэгов и получить словоформы. Оригинальный текст, который мы будем записывать в поле page_text , очистить от html-тэгов можно стандартной функцией strip_tags() , а для получения словоформ, для записи в поле page_words_index , можно воспользоваться моей функцией clear_text():
<?
include_once('stem.php'); //Алгоритм Стемминга
function clear_text($text)
{
$stemmer = new Lingua_Stem_Ru();
$text = preg_replace("/[^\w\x7F-\xFF\s]/"," ",strip_tags($text));
$text = explode(' ',$text);
foreach ($text as $word)
{
$min_word=$stemmer->stem_word($word);
$word_array[]=$min_word;
}
return strtoupper(implode(' ',$word_array));
}
echo clear_text("<br>Приветствую <a href='/bla'>вас</a>, <h1>жители зёмли!</h1>");
// ПРИВЕТСТВ ВАС ЖИТЕЛ ЗЕМЛ
?>
Функция добавления индекса будет выглядеть следующим образом:
function insert_index($url,$text)
{
$words=clear_text($text);
$text=strip_tags($text);
$date=time();
mysql_query("INSERT INTO `seach_index` (`url`,`date`,`page_text`,`page_words_in dex`)
VALUES ('$url',$date,'$text','$words')") or die(mysql_error());
}
Поиск
Перед поиском ключевые слова нужно будет преобразовать в словоформы всё той же функцией clear_text() и искать по полю page_words_index следующим запросом:
SELECT * from seach_index WHERE MATCH (page_words_index) AGAINST ('ЗЕМЛ')
Можно усложнить запрос и добавить подсчет релевантности, постраничный вывод , а на выводе результатов ключевые слова в поле page_text подсвечивать. Главное не забывайте изменять поисковый индекс при изменении самого объекта.
Ссылка на документацию по FULLTEXT поиску и релевантности
Поисковая табличка
В таблицу поискового индекса мы будем записывать url страницы , дату создания (я записываю в формате unix_time , поэтому и int(11)) , текс объекта без изменения и словоформы текста , без знаков препинания и лишних символов.
У меня получился такой дамп:
CREATE TABLE `seach_index` (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
`url` varchar(200) NOT NULL,
`page_text` text NOT NULL,
`date` int(11) NOT NULL,
`page_words_index` text NOT NULL,
FULLTEXT (`page_text`,`page_words_index`)
) ENGINE=MyISAM;
Чистим текст
Прежде чем пихать новости и страницы в поисковую табличку, их нужно очистить от тэгов и получить словоформы. Оригинальный текст, который мы будем записывать в поле page_text , очистить от html-тэгов можно стандартной функцией strip_tags() , а для получения словоформ, для записи в поле page_words_index , можно воспользоваться моей функцией clear_text():
<?
include_once('stem.php'); //Алгоритм Стемминга
function clear_text($text)
{
$stemmer = new Lingua_Stem_Ru();
$text = preg_replace("/[^\w\x7F-\xFF\s]/"," ",strip_tags($text));
$text = explode(' ',$text);
foreach ($text as $word)
{
$min_word=$stemmer->stem_word($word);
$word_array[]=$min_word;
}
return strtoupper(implode(' ',$word_array));
}
echo clear_text("<br>Приветствую <a href='/bla'>вас</a>, <h1>жители зёмли!</h1>");
// ПРИВЕТСТВ ВАС ЖИТЕЛ ЗЕМЛ
?>
Функция добавления индекса будет выглядеть следующим образом:
function insert_index($url,$text)
{
$words=clear_text($text);
$text=strip_tags($text);
$date=time();
mysql_query("INSERT INTO `seach_index` (`url`,`date`,`page_text`,`page_words_in
VALUES ('$url',$date,'$text','$words')") or die(mysql_error());
}
Поиск
Перед поиском ключевые слова нужно будет преобразовать в словоформы всё той же функцией clear_text() и искать по полю page_words_index следующим запросом:
SELECT * from seach_index WHERE MATCH (page_words_index) AGAINST ('ЗЕМЛ')
Можно усложнить запрос и добавить подсчет релевантности, постраничный вывод , а на выводе результатов ключевые слова в поле page_text подсвечивать. Главное не забывайте изменять поисковый индекс при изменении самого объекта.
Ссылка на документацию по FULLTEXT поиску и релевантности
Последнюю книгу Ален Карр легкий способ бросить курить я никак прочитать не могу ))) времени всё не хватает, а курить хочеться бросить. Вообще если честно, я для себя ещё сам не решил хочу я бросить курить или нет , мне просто нравиться сам процесс , люблю я попить кофе и покурить думая о каких-нибудь затыках.
Блин, вот нравиться мне JavaScript ,но не нравиться мне слово "кроссплатформенность". С помощью JS можно делать классные мелочи, которые делают проект более удобным и приятным. Но как представишь, что маленький скриптик надо будет в семи браузерах отладить, сразу как то и писать его становиться лень. Из всех браузеров конечно же отличился IE 6 , в нем всё работает не так как в остальных браузерах. Для того что бы в нём найти на странице CHECKBOX и поменять его значение на checked , это уже целая проблема т.к. это делаеться не как у всех браузеров , а следовательно нужно уже добавлять проверку на браузер и т.д. Опера хоть и быстрый , но глючный браузер без возможности отдебагить JS скрипт. Кстати недавно вышла бета версия IE 8 , если честно многие моменты приятно удивили. Новый IE более менее заработал как нормальный браузер , появился очень мощный инструмент для отладки JS и CSS , такое чувство что мелкомягкие чисто скин к Firefox'у другой нарисовали и продают как IE 8 ))
Хочу вашему вниманию представить алгоритм Стеммер Портера , для получения корня слова и дальнейшего поиска уже по корню. Алгоритм не использует словари этим в принципе всех и привлекает , не нужно хранить на сайте бинарные файлы словарей весом в десятки мегабайт. И работает он гораздо быстрее своих словарных конкурентов , хоть и не так качественно как phpMorphy или ruMor.
<?
$stemmer = new Lingua_Stem_Ru();
echo $stemmer->stem_word('Котеровыми');
?>
Не забудьте перед поиском в ключевом выражении заменить букву Ё на Е.
<?php
class Lingua_Stem_Ru
{
var $VERSION = "0.02";
var $Stem_Caching = 0;
var $Stem_Cache = array();
var $VOWEL = '/аеиоуыэюя/';
var $PERFECTIVEGROUND = '/((ив|ивши|ившись|ыв|ывши|ывшись)|((?<= [ая])(в|вши|вшись)))$/';
var $REFLEXIVE = '/(с[яь])$/';
var $ADJECTIVE = '/(ее|ие|ые|ое|ими|ыми|ей|ий|ый|ой|ем|им|ы м|ом|его|ого|еых|ую|юю|ая|яя|ою|ею)$/';
var $PARTICIPLE = '/((ивш|ывш|ующ)|((?<=[ая])(ем|нн|вш|ющ|щ) ))$/';
var $VERB = '/((ила|ыла|ена|ейте|уйте|ите|или|ыли|ей|у й|ил|ыл|им|ым|ены|ить|ыть|ишь|ую|ю)|((?<=[ая])(ла|на|ете|йте|ли|й|л|ем|н|ло|н о|ет|ют|ны|ть|ешь|нно)))$/';
var $NOUN = '/(а|ев|ов|ие|ье|е|иями|ями|ами|еи|ии|и|и ей|ей|ой|ий|й|и|ы|ь|ию|ью|ю|ия|ья|я)$/';
var $RVRE = '/^(.*?[аеиоуыэюя])(.*)$/';
var $DERIVATIONAL = '/[^аеиоуыэюя][аеиоуыэюя]+[^аеиоуыэюя]+[а еиоуыэюя].*(?<=о)сть?$/';
function s(&$s, $re, $to)
{
$orig = $s;
$s = preg_replace($re, $to, $s);
return $orig !== $s;
}
function m($s, $re)
{
return preg_match($re, $s);
}
function stem_word($word)
{
$word = strtolower($word);
$word = strtr($word, 'ё', 'е');
# Check against cache of stemmed words
if ($this->Stem_Caching && isset($this->Stem_Cache[$word])) {
return $this->Stem_Cache[$word];
}
$stem = $word;
do {
if (!preg_match($this->RVRE, $word, $p)) break;
$start = $p[1];
$RV = $p[2];
if (!$RV) break;
# Step 1
if (!$this->s($RV, $this->PERFECTIVEGROUND, '')) {
$this->s($RV, $this->REFLEXIVE, '');
if ($this->s($RV, $this->ADJECTIVE, '')) {
$this->s($RV, $this->PARTICIPLE, '');
} else {
if (!$this->s($RV, $this->VERB, ''))
$this->s($RV, $this->NOUN, '');
}
}
# Step 2
$this->s($RV, '/и$/', '');
# Step 3
if ($this->m($RV, $this->DERIVATIONAL))
$this->s($RV, '/ость?$/', '');
# Step 4
if (!$this->s($RV, '/ь$/', '')) {
$this->s($RV, '/ейше?/', '');
$this->s($RV, '/нн$/', 'н');
}
$stem = $start.$RV;
} while(false);
if ($this->Stem_Caching) $this->Stem_Cache[$word] = $stem;
return $stem;
}
function stem_caching($parm_ref)
{
$caching_level = @$parm_ref['-level'];
if ($caching_level) {
if (!$this->m($caching_level, '/^[012]$/')) {
die(__CLASS__ . "::stem_caching() - Legal values are '0','1' or '2'. '$caching_level' is not a legal value");
}
$this->Stem_Caching = $caching_level;
}
return $this->Stem_Caching;
}
function clear_stem_cache()
{
$this->Stem_Cache = array();
}
}
?>
Пример:class Lingua_Stem_Ru
{
var $VERSION = "0.02";
var $Stem_Caching = 0;
var $Stem_Cache = array();
var $VOWEL = '/аеиоуыэюя/';
var $PERFECTIVEGROUND = '/((ив|ивши|ившись|ыв|ывши|ывшись)|((?<=
var $REFLEXIVE = '/(с[яь])$/';
var $ADJECTIVE = '/(ее|ие|ые|ое|ими|ыми|ей|ий|ый|ой|ем|им|ы
var $PARTICIPLE = '/((ивш|ывш|ующ)|((?<=[ая])(ем|нн|вш|ющ|щ)
var $VERB = '/((ила|ыла|ена|ейте|уйте|ите|или|ыли|ей|у
var $NOUN = '/(а|ев|ов|ие|ье|е|иями|ями|ами|еи|ии|и|и
var $RVRE = '/^(.*?[аеиоуыэюя])(.*)$/';
var $DERIVATIONAL = '/[^аеиоуыэюя][аеиоуыэюя]+[^аеиоуыэюя]+[а
function s(&$s, $re, $to)
{
$orig = $s;
$s = preg_replace($re, $to, $s);
return $orig !== $s;
}
function m($s, $re)
{
return preg_match($re, $s);
}
function stem_word($word)
{
$word = strtolower($word);
$word = strtr($word, 'ё', 'е');
# Check against cache of stemmed words
if ($this->Stem_Caching && isset($this->Stem_Cache[$word])) {
return $this->Stem_Cache[$word];
}
$stem = $word;
do {
if (!preg_match($this->RVRE, $word, $p)) break;
$start = $p[1];
$RV = $p[2];
if (!$RV) break;
# Step 1
if (!$this->s($RV, $this->PERFECTIVEGROUND, '')) {
$this->s($RV, $this->REFLEXIVE, '');
if ($this->s($RV, $this->ADJECTIVE, '')) {
$this->s($RV, $this->PARTICIPLE, '');
} else {
if (!$this->s($RV, $this->VERB, ''))
$this->s($RV, $this->NOUN, '');
}
}
# Step 2
$this->s($RV, '/и$/', '');
# Step 3
if ($this->m($RV, $this->DERIVATIONAL))
$this->s($RV, '/ость?$/', '');
# Step 4
if (!$this->s($RV, '/ь$/', '')) {
$this->s($RV, '/ейше?/', '');
$this->s($RV, '/нн$/', 'н');
}
$stem = $start.$RV;
} while(false);
if ($this->Stem_Caching) $this->Stem_Cache[$word] = $stem;
return $stem;
}
function stem_caching($parm_ref)
{
$caching_level = @$parm_ref['-level'];
if ($caching_level) {
if (!$this->m($caching_level, '/^[012]$/')) {
die(__CLASS__ . "::stem_caching() - Legal values are '0','1' or '2'. '$caching_level' is not a legal value");
}
$this->Stem_Caching = $caching_level;
}
return $this->Stem_Caching;
}
function clear_stem_cache()
{
$this->Stem_Cache = array();
}
}
?>
<?
$stemmer = new Lingua_Stem_Ru();
echo $stemmer->stem_word('Котеровыми');
?>
Не забудьте перед поиском в ключевом выражении заменить букву Ё на Е.
http://ip2city.ru/ - отличная база, преимущественно по России и странам СНГ. На сайте есть ссылка на скачивание базы в формате CVS и демо проекта.База полностью бесплатная.
http://techinfo.net.ru/ip2ruscity/ - не плохая база по России и СНГ, но смысла в ней особого нет. Платная версия обновляется постоянно стоит 2000р. ,а определяет город хуже чем ip2city, а бесплатная версия 2004 года, так что не вариант.
http://ip-to-country.webhosting.info/nod
http://www.maxmind.com/app/lookup_city?t
http://php.ru/ip2country/ - база определения страны посетителя , т.к. она не большая и грамотно составлена, я пользуюсь именно ей.
Для увеличения производительности IP адрес представляется в виде десятичного числа, для преобразования есть в пхп две функции ip2long и long2ip. Если вам просто нужна база городов для сайта , вы так же можите сгруппировать её из имеющейся GeoIP базы.
