задача такая: необходим поиск по слову. для этого введенные слова разбиваются в массив. далее с помощью preg_match удаляются окончание, постфиксы и прочее. вопрос в следующем: как сделать так, чтобы preg_match искал все вхождения, т.е., к примеру есть слово с несколькими суффиксами. preg_match находит только последний, а как сделать так, чтобы он находил все?! preg_match_all не дуалось все организовать, т.к. он после нахождения первого совпадения последующий поиск продолжает с конца первого вхождения. На пример, если слово "множитель", то нужно откинуть суффиксы -и- и -тель- а откидывается только -тель- PHP: preg_match("/^(.*)(ость|ниу|енщ|ак|ок|ач|ей|лец|тель|чик|щик|ист|ниц|ница|иц|ица|н|телън|к|ск|еск|чат|ив|лив|чив|ав|ат|аст|ое|ев|овск|инск|енск|и|ну|ыва|ива|ова|ева|ва|о|е|ее|ей|ше|же|ейш|айш|ть|ти|ущ|ющ|ащ|ящ|вш|их|ем|им|ом|нн|енн|т|а|я|учи|ючи|в|вши|ши|л)$/i",$endless,$suffix); как возможно сделать так, чтобы preg_match выполнялся, пока не отбросит все суффиксы?! или же, быть может, есть уже стандартные методы преобразования слов для поиска (т.е. приведение к начальной форме \ сокращение до корня)
phpmorphy - видел...пробую разбираться, но пока не все так гладко ... хотелось бы что-то самому создать - так понятней! про рекурсию - нужно подумать...и придумать *) я думал сделать пару preg_match`ей которые бы выполнялись, пока все не будет сделанно, но это получится не очень хорошо... неплохо было бы с помощью preg_match_all, только чтобы он с конца искал, а не сначала (т.е. наоборот...) но тут сложность с позицией... т.е. с offset` ом
раньше использовал, потом попробовал Daitch-Mokotoff, но мне он не нравиться, тем что очень уж много хлама находит. Сейчас посматриваю с любопытством в сторону Sphinx (как мне изначально Psih и советовал , но проблемка в том что на чужих хостингах его особо не поюзаешь... Хочется написать свой велоспед конечно, я люблю это занятие, но пока что много более нужных вещей.
а вот с рекурсией что-то ничего не выходит *(( ... прошу помощи делаю вот так: PHP: function no_suffix ($word) { $doit = preg_match("/^(.*)(ость|ниу|енщ|ак|ок|ач|ей|лец|тель|чик|щик|ист|ниц|ница|иц|ица|н|телън|к|ск|еск|чат|ив|лив|чив|ав|ат|аст|ое|ев|овск|инск|енск|и|ну|ыва|ива|ова|ева|ва|о|е|ее|ей|ше|же|ейш|айш|ть|ти|ущ|ющ|ащ|ящ|вш|их|ем|им|ом|нн|енн|т|а|я|учи|ючи|в|вши|ши|л)$/i",$word,$out); if($doit == 1) { preg_match("/^(.*)(ость|ниу|енщ|ак|ок|ач|ей|лец|тель|чик|щик|ист|ниц|ница|иц|ица|н|телън|к|ск|еск|чат|ив|лив|чив|ав|ат|аст|ое|ев|овск|инск|енск|и|ну|ыва|ива|ова|ева|ва|о|е|ее|ей|ше|же|ейш|айш|ть|ти|ущ|ющ|ащ|ящ|вш|их|ем|им|ом|нн|енн|т|а|я|учи|ючи|в|вши|ши|л)$/i",$word,$out); $text_st = $out[1]; no_suffix ($text_st); echo "1 - $out[1]\n"; } else { die("Теперь суффиксов нет! $out[1]"); } } а как нужно?!
PHP: <?php $s = "жадносенщть"; echo printEnd( $s ); function printEnd( $s ) { if (preg_match("/^(.*)(ость|ниу|енщ|ак|ок|ач|ей|лец|тель|чик|щик|ист|ниц|ница|иц|ица|н|телън|к|ск|еск|чат|ив|лив|чив|ав|ат|аст|ое|ев|овск|инск|енск|и|ну|ыва|ива|ова|ева|ва|о|е|ее|ей|ше|же|ейш|айш|ть|ти|ущ|ющ|ащ|ящ|вш|их|ем|им|ом|нн|енн|т|а|я|учи|ючи|в|вши|ши|л)$/i",$s,$r)) { if (count($r) == 3) { echo $r[2] . "\n"; printEnd ( substr( $s, 0, strlen($s) - strlen($r[2]) ) ); } } } ?>
Не нужна тут рекурсия PHP: <?php header('Content-type: text/plain; charset=utf-8'); $sufx = array( 'ость', 'ниу', 'енщ', 'ак', 'ок', 'ач', 'ей', 'лец', 'тель', 'чик', 'щик', 'ист', 'ниц', 'ница', 'иц', 'ица', 'н', 'телън', 'к', 'ск', 'еск', 'чат', 'ив', 'лив', 'чив', 'ав', 'ат', 'аст', 'ое', 'ев', 'овск', 'инск', 'енск', 'и', 'ну', 'ыва', 'ива', 'ова', 'ева', 'ва', 'о', 'е', 'ее', 'ей', 'ше', 'же', 'ейш', 'айш', 'ть', 'ти', 'ущ', 'ющ', 'ащ', 'ящ', 'вш', 'их', 'ем', 'им', 'ом', 'нн', 'енн', 'т', 'а', 'я', 'учи', 'ючи', 'в', 'вши', 'ши', 'л' ); $word = 'множитель'; preg_match('%^([a-zа-я]+)(?:'.implode('|', $sufx).')*$%Uui', $word, $m); echo $word.' => '.$m[1]; ?>