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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Цикл foreach для обработки текстового файла, Выбор опред-ного текста из всего текста  
V
    Опции темы
Konstantin555
  Дата 20.8.2008, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть файл следующего содержания:
Код

=N=A=M=E= Name_1 =N=A=M=E=
<Name_11>

***Chapter_1***
Some text 1 Some text 2 Some text 3 Some text 4 
Some text 5 Some text 6 Some text 7 Some text 8 

***Chapter_2***
Some text 9 Some text 10 
Some text 11 Some text 12 
Some text 13 Some text 14 
Some text 15 Some text 16 
Some text 17 Some text 18 
***End_chapter***



Нужно определить текст, идущий между ***Chapter_1*** и ***Chapter_2***, а также ***Chapter_2*** и ***End_chapter***

Пробывал следующим циклом - в результате - цифра 0 smile 
(Цикл пока что общий. Для начала - хотя бы вывести все строки с помощью цикла foreach)
Код

 function get_chapter_text1()
 {
  $TxtFile=file("Sample.txt");
  foreach($TxtFile as $value)
  {
   $res+=$res.$value." ";
  }

  return $res;
 };

В чём ошибка?...


П.С.: тема разделена - выборка с регулярными выражениями здесь

Это сообщение отредактировал(а) Konstantin555 - 20.8.2008, 00:24
PM MAIL   Вверх
solenko
Дата 20.8.2008, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



 $res.= $value." ";


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
Konstantin555
Дата 20.8.2008, 01:56 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(solenko @ 20.8.2008,  00:45)
$res.= $value." ";

Thanks! Полный текст вывести удалось, только я использовал 
Код
$res.= $value;


Теперь пытаюсь вывести, что находится между ***Chapter_1*** и ***Chapter_2***. В результате - пустая строка...
Код

 function get_chapter_text1()
 {
  $TxtFile=file("Sample.txt");
  foreach($TxtFile as $key=>$value) //внешний цикл
  {
   if(strpos($value,'***Chapter_')<>0) //если нашлось первое вхождение, т.е. ***Chapter_1***, то
   {
    foreach($TxtFile as $key1=>$value1) //запускаем внутренний цикл
    {
      $res.=$TxtFile[$key+$key1]; //к результату прибавляем №строки-первого-вхождения $key и текущее значение $key1
      if (strpos($value,'***Chapter_')<>0) break; //Если находится определённая строка (в данном случае ***Chapter_2***), то внутренний цикл прерывыается
    };
    break; //прерываем внешний цикл
   }
  }

  return $res; //возвращаем результат
 };


Это сообщение отредактировал(а) Konstantin555 - 20.8.2008, 01:58
PM MAIL   Вверх
nornad
Дата 20.8.2008, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

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



мдя... а подумать не хотим? smile 
Код

$TxtFile=file("Sample.txt");
$res = array();
$section = '';
foreach($TxtFile as $str) {
  if(preg_match('/^[*]{3}(.*?)[*]{3}/', $str, $matches) {
    $section = $matches[1];
  } else {
    $res[$section] .= $str; // ну или .= trim($str).' ';
  }
}
return $res;


Добавлено через 1 минуту и 51 секунду
уже подумал  smile 


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
Konstantin555
Дата 20.8.2008, 09:57 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(nornad @ 20.8.2008,  02:01)
мдя... а подумать не хотим? smile 
Код

$TxtFile=file("Sample.txt");
$res = array();
$section = '';
foreach($TxtFile as $str) {
  if(preg_match('/^[*]{3}(.*?)[*]{3}/', $str, $matches) {
    $section = $matches[1];
  } else {
    $res[$section] .= $str; // ну или .= trim($str).' ';
  }
}
return $res;


Добавлено @ 02:03
уже подумал  smile

Результат: "Array"!

Можно ли как-то модифировать мой цикл и обойтись без регулярных выражений?..
PM MAIL   Вверх
nornad
Дата 20.8.2008, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

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



Konstantin555, ну естественно массив на выходе. Ты что, даже не пытаешься подумать, что в коде написано? Просто копируешь?
Обойтись без регулярок можно. Просто, за счёт регулярок я короткой конструкцией получаю имя секции. Без них будет больше кода с тем же смыслом.
Что-то вроде:
Код

if(0 !== strpos($str, '***')) $res[$section] .= $str;
elseif(4 < strrpos($str, '***')) $res[$section] .= $str;
else $section = substr($str, 3, strrpos($str, '***') - 3);


Добавлено через 1 минуту и 27 секунд
А твой цикл, кстати, не ловит "***End_chapter***"


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
nornad
Дата 20.8.2008, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

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



Ещё заметил:
Код

if(strpos($value,'***Chapter_')<>0)

а) strpos возвращает false, если не нашёл, либо число - позицию с нуля.
б) если позиция не равна нулю, то либо строка не найдена, либо она не с начала строки.

Это сообщение отредактировал(а) nornad - 20.8.2008, 16:23


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
Konstantin555
Дата 20.8.2008, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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


 




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


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

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