Разбить текст на слова

Тема в разделе "PHP", создана пользователем HatoL, 27 ноя 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. HatoL

    HatoL

    Регистр.:
    5 фев 2008
    Сообщения:
    206
    Симпатии:
    36
    Имеется следующий кусок кода, который разбивает некую строку на слова:
    PHP:
    $string 'Сайт по продаже автомобилей';

    if (
    === preg_match('##u'$string))
    {
        
    $words preg_split('#[0-9\W_]+#Disu'$string, -1PREG_SPLIT_NO_EMPTY);
    }
    else
    {
        
    $words preg_split('#[0-9\W_]+#Dis'$string, -1PREG_SPLIT_NO_EMPTY);
    }
    На «Денвер-3» все работает. Поставил на хостинг с FreeBSD - берутся только английские слова (или не только, но русские точно не видит). Если сайт в UTF-8, то все нормально (в коде выше есть проверка).

    P.S. просьба давать только помощь, которая не требует «хирургического вмешательства». Модуль требуется написать в таком виде, в каком он будет работать без установки дополнительных расширений PHP и его перекомпиляции.
     
  2. zetar

    zetar

    Регистр.:
    18 май 2007
    Сообщения:
    497
    Симпатии:
    348
    попробуй данную функцию
    http://ru2.php.net/manual/en/function.str-word-count.php
    там еще много примеров на эту тему
     
  3. RolCom

    RolCom

    Регистр.:
    12 мар 2008
    Сообщения:
    351
    Симпатии:
    108
    HatoL нравится это.
  4. chewie

    chewie Создатель

    Регистр.:
    17 ноя 2007
    Сообщения:
    41
    Симпатии:
    1
    А почему не попробуешь с разделителем?
    Типа:
    Код:
    <?php
    
    $words = explode(' ', $string);
    
    ?>
    
    или с регуляркой без учета количества пробелов между символами:

    Код:
    <?php
    
    $words = preg_split('\s', $string);
    
    ?>
    
     
  5. HatoL

    HatoL

    Регистр.:
    5 фев 2008
    Сообщения:
    206
    Симпатии:
    36
    потому что разделителем может быть и запятая, и тире, и апостроф, и… Поэтому появляется выбор - либо перечислять все спец. символы и захватывать все, кроме них, либо захватывать только определенные символы. На самом деле второй вариант сложнее, но лучше. Страница может быть и в Юникоде, и в ANSI, да и у разных языков разные символы считаются буквами.

    P.S. сделал с помощью локали.
     
  6. vitvvs

    vitvvs Постоялец

    Регистр.:
    4 окт 2007
    Сообщения:
    92
    Симпатии:
    11
    да вроде все нормально работает
     
  7. serjinio

    serjinio

    Регистр.:
    10 май 2007
    Сообщения:
    439
    Симпатии:
    49
    Попробуйте должно подойти ..
    PHP:
    $x=
    На «Денвер-3» все работает. 
    Поставил на хостинг с FreeBSD - 
    берутся только английские слова (
    или не только, но русские точно не видит
    ). ~~~__ Если сайт в UTF-8, то все нормально 
    (в коде выше есть проверка).anyone posting anthing 
    with X-MOBILE signature , %^& on the release, will be'
    ;
    preg_match_all('/([А-Яа-яЁёA-Za-z]+)/u'$x$ok);

    for (
    $i=0$i<count($ok[1]); $i++)
    echo 
    $ok[1][$i].'<br />';
     
  8. upandhigh

    upandhigh

    Регистр.:
    11 фев 2009
    Сообщения:
    235
    Симпатии:
    89
    PHP:
    if (mb_check_encoding($string"UTF-8"))
    {
        
    $words preg_split('#[0-9\W_]+#u'$string, -1PREG_SPLIT_NO_EMPTY); 
    }
    else
    {
       
    $words preg_split('#[0-9\W_]+#'$string, -1PREG_SPLIT_NO_EMPTY)
    }
     
  9. kud

    kud Постоялец

    Регистр.:
    18 фев 2009
    Сообщения:
    89
    Симпатии:
    11
    если использовать разбивку текста по словам, лучше использовать модификатор "\b" - граница слова:

    PHP:
    $string "Потому-что,этот модификатор,позволяет, разбивать на слова даже если они идут без пробела после занка припинания!Вот такие дела?Ясно?!";
    preg_match_all("#\b(\w+)\b#",$string,$out);
    echo 
    "<pre>";
    print_r($out);
    echo 
    "</pre>";
     
  10. black.cat

    black.cat

    Регистр.:
    13 ноя 2008
    Сообщения:
    203
    Симпатии:
    32
    еще вариант сначала нормализовать предложение так:
    меняем "," на ", "
    меняем "." на ". "
    меняем "`" на "` "
    и т.д.
    и после этого имеем гарантирвоанно разделенную пробелами последовательность
    рубите ее хоть list()=split хоть preg_match_all ...
    тока не забывайте trim()
     
Статус темы:
Закрыта.