Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите сделать вырезку из длнной стрроки, строковые функции 
:(
    Опции темы
BIRD
  Дата 28.7.2005, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 20.7.2005
Где: Киев

Репутация: нет
Всего: нет



помогите найти и врезать из длинной строки слово + по 50 символов справа и слева от него.

так как строка длиннющая - регулярные выражения не катят (система виснет) smile
PM MAIL ICQ   Вверх
Bikutoru
Дата 28.7.2005, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 8
Всего: 22



Для поиска по сайту что-ли?
Так можно попробовать
Код

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 "";
}



--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Mal Hack
Дата 28.7.2005, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Что-то как-то сложно.
Код
<?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 

PM ICQ   Вверх
Bikutoru
Дата 28.7.2005, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 8
Всего: 22



Цитата
Что-то как-то сложно.

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


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Mal Hack
Дата 28.7.2005, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Bikutoru а в таком случае надо пробелами с двух сторон обрамлять слово, искомое smile
PM ICQ   Вверх
Akina
Дата 29.7.2005, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 5
Всего: 454



Bikutoru
Неправда. доминантное. Вот слова " дом " - и правда нету.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Bikutoru
Дата 29.7.2005, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 8
Всего: 22



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

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


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
Akina
Дата 29.7.2005, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 5
Всего: 454



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

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Ignat
Дата 29.7.2005, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 10
Всего: 73



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


--------------------
Теперь при чем :P
PM   Вверх
Mal Hack
Дата 29.7.2005, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Подправил:
Код
 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
PM ICQ   Вверх
Bikutoru
Дата 29.7.2005, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: 8
Всего: 22



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

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);


Это сообщение отредактировал(а) Bikutoru - 29.7.2005, 16:33


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0861 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.