За последние 24 часа нас посетили 15767 программистов и 1634 робота. Сейчас ищут 940 программистов ...

preg_match

Тема в разделе "PHP для новичков", создана пользователем lanzs, 26 окт 2008.

  1. lanzs

    lanzs Активный пользователь

    С нами с:
    8 окт 2008
    Сообщения:
    21
    Симпатии:
    0
    задача такая: необходим поиск по слову. для этого введенные слова разбиваются в массив. далее с помощью preg_match удаляются окончание, постфиксы и прочее.
    вопрос в следующем: как сделать так, чтобы preg_match искал все вхождения, т.е., к примеру есть слово с несколькими суффиксами. preg_match находит только последний, а как сделать так, чтобы он находил все?! preg_match_all не дуалось все организовать, т.к. он после нахождения первого совпадения последующий поиск продолжает с конца первого вхождения. На пример, если слово "множитель", то нужно откинуть суффиксы -и- и -тель-
    а откидывается только -тель-
    PHP:
    1.  
    2. preg_match("/^(.*)(ость|ниу|енщ|ак|ок|ач|ей|лец|тель|чик|щик|ист|ниц|ница|иц|ица|н|телън|к|ск|еск|чат|ив|лив|чив|ав|ат|аст|ое|ев|овск|инск|енск|и|ну|ыва|ива|ова|ева|ва|о|е|ее|ей|ше|же|ейш|айш|ть|ти|ущ|ющ|ащ|ящ|вш|их|ем|им|ом|нн|енн|т|а|я|учи|ючи|в|вши|ши|л)$/i",$endless,$suffix);
    3.  
    как возможно сделать так, чтобы preg_match выполнялся, пока не отбросит все суффиксы?!
    или же, быть может, есть уже стандартные методы преобразования слов для поиска (т.е. приведение к начальной форме \ сокращение до корня)
     
  2. dAllonE

    dAllonE Guest

    Попробуй phpmorphy быть может подойдет.
     
  3. obsrv

    obsrv Активный пользователь

    С нами с:
    2 окт 2008
    Сообщения:
    238
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    почему не сделать рекурсией ?
     
  4. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    а ты сам используешь?
     
  5. lanzs

    lanzs Активный пользователь

    С нами с:
    8 окт 2008
    Сообщения:
    21
    Симпатии:
    0
    phpmorphy - видел...пробую разбираться, но пока не все так гладко ... хотелось бы что-то самому создать - так понятней!
    про рекурсию - нужно подумать...и придумать *)
    я думал сделать пару preg_match`ей которые бы выполнялись, пока все не будет сделанно, но это получится не очень хорошо...
    неплохо было бы с помощью preg_match_all, только чтобы он с конца искал, а не сначала (т.е. наоборот...) но тут сложность с позицией... т.е. с offset` ом
     
  6. dAllonE

    dAllonE Guest

    раньше использовал, потом попробовал Daitch-Mokotoff, но мне он не нравиться, тем что очень уж много хлама находит.
    Сейчас посматриваю с любопытством в сторону Sphinx (как мне изначально Psih и советовал :), но проблемка в том что на чужих хостингах его особо не поюзаешь...
    Хочется написать свой велоспед конечно, я люблю это занятие, но пока что много более нужных вещей.
     
  7. lanzs

    lanzs Активный пользователь

    С нами с:
    8 окт 2008
    Сообщения:
    21
    Симпатии:
    0
    а вот с рекурсией что-то ничего не выходит *(( ... прошу помощи
    делаю вот так:
    PHP:
    1.  
    2. function no_suffix ($word) {
    3. $doit = preg_match("/^(.*)(ость|ниу|енщ|ак|ок|ач|ей|лец|тель|чик|щик|ист|ниц|ница|иц|ица|н|телън|к|ск|еск|чат|ив|лив|чив|ав|ат|аст|ое|ев|овск|инск|енск|и|ну|ыва|ива|ова|ева|ва|о|е|ее|ей|ше|же|ейш|айш|ть|ти|ущ|ющ|ащ|ящ|вш|их|ем|им|ом|нн|енн|т|а|я|учи|ючи|в|вши|ши|л)$/i",$word,$out);
    4. if($doit == 1) {
    5. preg_match("/^(.*)(ость|ниу|енщ|ак|ок|ач|ей|лец|тель|чик|щик|ист|ниц|ница|иц|ица|н|телън|к|ск|еск|чат|ив|лив|чив|ав|ат|аст|ое|ев|овск|инск|енск|и|ну|ыва|ива|ова|ева|ва|о|е|ее|ей|ше|же|ейш|айш|ть|ти|ущ|ющ|ащ|ящ|вш|их|ем|им|ом|нн|енн|т|а|я|учи|ючи|в|вши|ши|л)$/i",$word,$out);
    6. $text_st = $out[1];
    7. no_suffix ($text_st);
    8. echo "1 - $out[1]\n";
    9.  }
    10. else {
    11. die("Теперь суффиксов нет! $out[1]");
    12.  }
    13. }
    14.  
    а как нужно?!
     
  8. lanzs

    lanzs Активный пользователь

    С нами с:
    8 окт 2008
    Сообщения:
    21
    Симпатии:
    0
    need help
    ...сам додуматься ну никак не могу :(
     
  9. obsrv

    obsrv Активный пользователь

    С нами с:
    2 окт 2008
    Сообщения:
    238
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    PHP:
    1.  
    2. <?php
    3. $s = "жадносенщть";
    4. echo printEnd( $s );
    5.  
    6. function printEnd( $s ) {
    7.     if (preg_match("/^(.*)(ость|ниу|енщ|ак|ок|ач|ей|лец|тель|чик|щик|ист|ниц|ница|иц|ица|н|телън|к|ск|еск|чат|ив|лив|чив|ав|ат|аст|ое|ев|овск|инск|енск|и|ну|ыва|ива|ова|ева|ва|о|е|ее|ей|ше|же|ейш|айш|ть|ти|ущ|ющ|ащ|ящ|вш|их|ем|им|ом|нн|енн|т|а|я|учи|ючи|в|вши|ши|л)$/i",$s,$r)) {
    8.         if (count($r) == 3) {
    9.             echo $r[2] . "\n";
    10.             printEnd ( substr( $s, 0, strlen($s) - strlen($r[2]) ) );
    11.         }
    12.     }
    13. }
    14. ?>
    15.  
     
  10. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Не нужна тут рекурсия

    PHP:
    1. <?php
    2.  
    3. header('Content-type: text/plain; charset=utf-8');
    4.  
    5. $sufx = array(
    6.     'ость', 'ниу', 'енщ', 'ак', 'ок', 'ач', 'ей', 'лец', 'тель', 'чик', 'щик', 'ист', 'ниц', 'ница', 'иц', 'ица',
    7.     'н', 'телън', 'к', 'ск', 'еск', 'чат', 'ив', 'лив', 'чив', 'ав', 'ат', 'аст', 'ое', 'ев', 'овск', 'инск',
    8.     'енск', 'и', 'ну', 'ыва', 'ива', 'ова', 'ева', 'ва', 'о', 'е', 'ее', 'ей', 'ше', 'же', 'ейш', 'айш', 'ть',
    9.     'ти', 'ущ', 'ющ', 'ащ', 'ящ', 'вш', 'их', 'ем', 'им', 'ом', 'нн', 'енн', 'т', 'а', 'я', 'учи', 'ючи', 'в',
    10.     'вши', 'ши', 'л'
    11. );
    12.  
    13.  
    14. $word = 'множитель';
    15.  
    16. preg_match('%^([a-zа-я]+)(?:'.implode('|', $sufx).')*$%Uui', $word, $m);
    17.  
    18. echo $word.' => '.$m[1];
    19.  
    20. ?>
     
  11. QQQ

    QQQ Активный пользователь

    С нами с:
    21 ноя 2007
    Сообщения:
    538
    Симпатии:
    0
    lanzs
    тебе для поиска надо?
    тогда погугли по слову: cтемминг