Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > помогите сделать вырезку из длнной стрроки


Автор: BIRD 28.7.2005, 18:42
помогите найти и врезать из длинной строки слово + по 50 символов справа и слева от него.

так как строка длиннющая - регулярные выражения не катят (система виснет) smile

Автор: Bikutoru 28.7.2005, 18:52
Для поиска по сайту что-ли?
Так можно попробовать
Код

function cutFromStringByWord($string, $word)
{
    if (($pos = strpos($string, " " . $word . " ")) !== false)
    {
        $start = $pos - 50;
        if ($start < 0)
            $start = 0;

        return substr($string, $start, strlen($word) + 50);
    }

    if (($pos = strpos($string, $word . " ")) !== false && $pos == 0)
        return substr($string, 0, strlen($word) + 50);

    if (($pos = strpos($string, " " . $word)) !== false && $pos == strlen($string) - strlen($word))
    {
        $start = $pos - 50;
        if ($start < 0)
            $start = 0;

        return substr($string, $start, strlen($word) + 50);
    }

    return "";
}

Автор: Mal Hack 28.7.2005, 19:04
Что-то как-то сложно.
Код
<?php

 $test = <<<EOF
    kdfjldkj  jlkjlkj lkdjsl jdkl jklsdfjklsdj 4f4h48j 848jj49j 9sdjklfsdf sd
    f sd
    f
    sdf            dkl jklsdfjklsdj 4f4h48j 848jj49j 9sdj
     sd
     f
     sdf                          dkl jklsdfjklsdj 4f4h48j 848jj49j 9sdj
      sd
      f                dkl jklsdfjklsdj 4f4h48j 848jj49j 9sdj
      sdf        dkl jklsdfjklsdj 4f4h48j 848jj49j 9sdj
      sdf
      sd
      f                     dkl jklsdfjklsdj 4f4h48j 848jj49j 9sdj
      s 4f4
      f3           dkl jklsdfjklsdj 4f4h48j 848jj49j 9sdj
      f4
      3434
      f                         dkl jklsdfjklsdj 4f4h48j 848jj49j 9sdj
      34f
      34             dkl jklsdfjklsdj 4f4h48j 848jj49j 9sdj
      r

      sd
      fsdfsd            dkl jklsdfjklsdj 4f4h48j 848jj49j 9sdj
      fdsfhskdhf834wfd
      s    dkl jklsdfjklsdj 4f4h48j 848jj49j 9sdj
      fd     dkl jklsdfjklsdj 4f4h48j 848jj49j 9sdj
      sf        TEST   dkl jklsdfjklsdj 4f4h48j 848jj49j 9sdjdkl jklsdfjklsdj 4f4h48j 848jj49j 9sdj
      sf
             dkl jklsdfjklsdj 4f4h48j 848jj49j 9sdj           dkl jklsdfjklsdj 4f4h48j 848jj49j 9sdj
      34                        dkl jklsdfjklsdj 4f4h48j 848jj49j 9sdj
               dkl jklsdfjklsdj 4f4h48j 848jj49j 9sdj
      34
      5        dkl jklsdfjklsdj 4f4h48j 848jj49j 9sdjdkl jklsdfjklsdj 4f4h48j 848jj49j 9sdj                  dkl jklsdfjklsdj 4f4h48j 848jj49j 9sdj
      345          dkl jklsdfjklsdj 4f4h48j 848jj49j 9sdj
      34
      5             dkl jklsdfjklsdj 4f4h48j 848jj49j 9sdj
      345         dkl jklsdfjklsdj 4f4h48j 848jj49j 9sdj
      4
                    dkl jklsdfjklsdj 4f4h48j 848jj49j 9sdj
      fsfksdfiflisdjlfjsdjflsdjfli

EOF;

 function test( $word , $string )
  {
   if( strpos( $string , $word ) === FALSE )
    {  return;  }

   $a = strpos( $string , $word );

   return substr( $string
                  , ( ( ( $a - 50 ) < 0 ) ? 0 : $a - 50 )
                  , ( ( ( $a + 50 + strlen( $word ) ) > strlen( $string ) ) ? ( strlen( $string ) - $a ) : strlen( $word ) + 100 )
         );
  }

 print test( "TEST" , $test );

?>
Вывод: lsdfjklsdj 4f4h48j 848jj49j 9sdj sf TEST dkl jklsdfjklsdj 4f4h48j 848jj49j 9sdjdkl jklsd 

Автор: Bikutoru 28.7.2005, 19:20
Цитата
Что-то как-то сложно.

А если взять фразу
Цитата
Вы можете наблюдать доминантное поведение самцов гориллы в брачный период
и искать там слово "дом".
(strpos( $string , $word ) !== false) == true и всё замечательно, а самого слова "дом"-то нет!

Автор: Mal Hack 28.7.2005, 19:58
Bikutoru а в таком случае надо пробелами с двух сторон обрамлять слово, искомое smile

Автор: Akina 29.7.2005, 08:13
Bikutoru
Неправда. доминантное. Вот слова " дом " - и правда нету.

Автор: Bikutoru 29.7.2005, 09:32
Mal Hack, ну так я его с двух сторон и обрамляю, но слово может быть в начале строки или в конце, тогда пробел должен быть с одной стороны. Проблема только в том, что там может быть не прбел, а знак препинания...

Akina, но человек-то просит вырезать слово, а не его часть...

Автор: Akina 29.7.2005, 10:03
Цитата(Bikutoru @ 29.7.2005, 10:32)
человек-то просит вырезать слово, а не его часть

Машина - дура. Она делает то, что ты просишь, а не то что ты хочешь. Не умеешь просить правильно - получаешь хрень. Адназначна. Нужно тебе СЛОВО - значит укажи что нужно слово. Впереди - пробел, сзади - пробел изи знак препинания. Не указал - сам виноват.

Автор: Ignat 29.7.2005, 10:58
Блин, а какая проблема?
Берем исходную строку, заменяем все знаки пунктуации и переноса на пробелы, приводим к нижнему регистру и добавляем по пробелу в начале и конце. Так получили строку для поиска со сдвигом в 1 знак (за счет начального пробела). Ищем ф-цией strpos вхождение строки, полученной $needle=" ".strtolower($needle)." "; к полученному значению добавим 1 - мы получили вхождение.

Автор: Mal Hack 29.7.2005, 14:24
Подправил:
Код
 function test( $word , $string )
  {
   if( strpos( $string , $word ) === FALSE )
    {  return;  }
   $a = strpos( $string , $word );
   return substr( $string
                  , ( ( ( $a - 50 ) < 0 ) ? 0 : $a - 50 )
                  , ( ( ( $a + 50 + strlen( $word ) ) > strlen( $string ) ) ? ( strlen( $string ) - $a ) : strlen( $word ) + 100 )
         );
  }

 $wrd = "TEST";
 $test = preg_replace( "#(,|\.|\:|\;|\"|\'|\?|\!)#" , " " , $test);
 print test( " " . $wrd . " " , " " . $test . " " );

строку тестовую сюда не писал smile

Автор: Bikutoru 29.7.2005, 16:32
Цитата
Машина - дура. Она делает то, что ты просишь, а не то что ты хочешь. Не умеешь просить правильно - получаешь хрень. Адназначна. Нужно тебе СЛОВО - значит укажи что нужно слово. Впереди - пробел, сзади - пробел изи знак препинания. Не указал - сам виноват.

Akina, я указал, нужно просто повнимательнее посмотреть мой код, а только потом обрушивать на меня критику...

Цитата
Блин, а какая проблема?

Сказав, что это проблема, я хотел указать на то, что этот случай не рассматривается в предложенном решении.

Предлагаю на
Код

function preview($word, $string)
{
    /**
     * Тема звучит как "сделать вырезку из _длинной_ строки",
     *поэтому лучше будет заменить preg_replace на str_replace
     */
    $signs = array(",", ".", ":", ";", "\"", "'", "?", "!");
    $test = $string;
    foreach ($signs as $sign)
        $test = str_replace($sign, " ", $test);

    print("<BR>" . $test . "<BR>");

    $pos = strpos((" " . $test . " "), (" " . $word . " "));
    if ($pos === false)
        return false;

    $start = ($pos - 51 >= 0)? ($pos - 11): 0;
    $length = ($pos - $start) + strlen($word) + 50;

    /**
     * Необходимо делать вырезку из начальной строки
     */
    return substr($string, $start, $length);
}


print preview($wrd, $rest);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)