Вырезание подстроки

Тема в разделе "PHP", создана пользователем pslava, 4 июл 2008.

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

    pslava

    Регистр.:
    16 май 2007
    Сообщения:
    618
    Симпатии:
    122
    Как можно реализовать вырезание из строки первых 200 символов с целым последним словом, чтобы не обрезало текст на полуслове: слово1 слово2 слово3 слов...?
     
  2. gregzem

    gregzem

    Регистр.:
    21 окт 2007
    Сообщения:
    200
    Симпатии:
    63
    Вот так:

    Код:
    <?
    $l_Num = 33; // кол-во знаков
    $l_String = "слово1 слово2 слово3 слово4 слово5 слово6";
    $l_Result = preg_replace("|(.+)\s\w+|", "$1", (substr($l_String, 0, $l_Num)));
    print $l_Result;
    ?>
    
     
    Simpson нравится это.
  3. ZCFD

    ZCFD

    Регистр.:
    16 янв 2008
    Сообщения:
    989
    Симпатии:
    437
    имхо проще найти первый пробел после заданного числа символов и резать до него

    PHP:
    $num=200;
    $end=strpos($str,' ',$num);
    $result=substr($str,0,$end);
    зачем вставлять регекспы без повода ?
     
  4. gregzem

    gregzem

    Регистр.:
    21 окт 2007
    Сообщения:
    200
    Симпатии:
    63
    Или так :) Только искать бы надо назад, если 200 символов - максимум.
     
  5. netwom

    netwom Создатель

    Регистр.:
    14 июн 2008
    Сообщения:
    27
    Симпатии:
    2
    Если форматирование строки нестандартное, то слова могут разделяться не пробелом, а скажем, точкой. Т.е. искать надо регуляркой по нестроковым символам.
     
  6. zaartix1

    zaartix1 Читатель

    Заблокирован
    Регистр.:
    9 апр 2008
    Сообщения:
    4
    Симпатии:
    2
    вообще этот метод легко не сработает, если к примеру строчка будет такой:

    Код:
    новая&nbsp;строчка,&nbsp;или&lt;br&gt;перенос&nbsp;на&nbsp;новую&nbsp;строку.
    
    перед поиском пробела надо очистить текст от тегов (striptags), или хотя-бы сущностей (htmlentities).
     
  7. ZCFD

    ZCFD

    Регистр.:
    16 янв 2008
    Сообщения:
    989
    Симпатии:
    437
    вообще теоретикам стоит помнить, что любое частное решение быстрее м проще чем общее , хотя и не является универсальным

    а еще это решение не будет работать если на системе не стоит интерпритатор php и т.д. .....
     
  8. cds

    cds Постоялец

    Регистр.:
    28 янв 2007
    Сообщения:
    90
    Симпатии:
    8
    Можно так:
    PHP:
    <?php
    $myvar 
    "слово1 слово2 слово3 слов...";

    $var_exploded explode$myvar" " );

    $count $i 0;
    $finish_string "";

    while ( 
    $count 200 )
    {
       
    $count += strlen$var_exploded[$i++] ) + 1;
       
    $finish_string .= $var_exploded[$i] + " ";
    }
    ?>
     
  9. gregzem

    gregzem

    Регистр.:
    21 окт 2007
    Сообщения:
    200
    Симпатии:
    63
    cds, выглядит монстрически :)

    Я в итоге сделал так (\S чтобы "положить" на локаль, остальное - стрипанье тегов и энтити, чтоб не мешались в анонсе, если не нужно - уберите:(
    PHP:
      function GetOnlyPart($par_String$par_Len) {
         
    $l_Result preg_replace("|(.+)\s\S+|""$1", (substr(strip_tags(html_entity_decode($par_String)), 0$par_Len)));
         return 
    $l_Result;
       }
     
  10. cds

    cds Постоялец

    Регистр.:
    28 янв 2007
    Сообщения:
    90
    Симпатии:
    8
    монстрически, не монстрически, а вот по скорости должно делать любой preg_replace (не проверял)
     
Статус темы:
Закрыта.