Автор Тема: Ребята, помогите несчастной девушке разобраться с чтением строк между шаблонами  (Прочитано 4926 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Dinara

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 28
  • +0/-0
  • 0
    • Просмотр профиля
    • http://dinara.ru
Проблема такая:
есть текстовый файл, весь размеченный таким образом:

bla-bla-bla
bla-bla-bla


И нужно выдирать из него то, что между определенными тегами. То есть именно несколько строк. Теги всегда простые, без параметров и вообще не html.

С надеждой, Динара.
Должно работать© - ритуальная фраза, которую произносят программисты, когда сами не понимают, что сделали.

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
Может так:
« Ответ #1 : 08 Января 2002, 02:14:06 »
Можно так:

#!/usr/bin/perl

my $text= qq~

bla-bla-bla
bla-bla-bla


bla-bla-bla
bla-bla-bla


bla-bla-bla
bla-bla-bla

~;
my %content;
my $tag;
while($text=~/(<(\\w+)>([\\w\\W]+)<\\/\\w+>)/){
  $content{$2} .=$3;# .= на случай повторения
  $tag=$1;
  $text=~s/$tag//;
}

foreach my $key (keys %content){
 print "$key:\\n $content{$key}";
}


А можно так (вариант2, на мой взгляд хуже первого):

#!/usr/bin/perl
my $text= qq~

bla-bla-bla
bla-bla-bla


bla-bla-bla
bla-bla-bla


bla-bla-bla
bla-bla-bla

~;

my @content=split(/<\\/[\\w\\d]+>/, $text);
my %content;
my $tag;

foreach my $elm(@content){
   if ($elm=~/<([\\w\\d]+)>([\\w\\W]+)/){$content{$1}=$2;}
}   
foreach my $key (keys %content){
 print "$key:\\n $content{$key}\\n\\n";
}

Если хочешь как то иначе ;) скажи. Вообще, мне такой тип шаблона заинтересовал.
« Последнее редактирование: 08 Января 2002, 02:21:45 от Green Kakadu »
 в исканиях.

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
маленькое пояснение
« Ответ #2 : 08 Января 2002, 02:16:51 »
т.е.
нужно содержимое TAG1, оно тут: $content{\'TAG1\'},
TAG2: $content{\'TAG2\'}

;( правда если будут вложения то привет...
 в исканиях.

Оффлайн Dinara

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 28
  • +0/-0
  • 0
    • Просмотр профиля
    • http://dinara.ru
Ужас, я ничего не поняла.... глупая.

А можно как-нибудь использовать Range Operator? Ну то есть можно, конечно, но вот как? На мой взгляд, это специально для этого случая оператор.
оператор - .., две точки
Должно работать© - ритуальная фраза, которую произносят программисты, когда сами не понимают, что сделали.

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
если проще
« Ответ #4 : 08 Января 2002, 02:37:13 »
#!/usr/bin/perl
my $text= qq~

bla-bla-bla
bla-bla-bla

~;
if ($text=~/<[\\w\\d]+>([\\w\\W]+)<\\/[\\w\\d]+>/){
$content=$1;
}
print $content;


 
Цитировать
А можно как-нибудь использовать Range Operator? Ну то есть можно, конечно, но вот как? На мой взгляд, это специально для этого случая оператор.

а можно примерчик, может тогда соображу к какому виду вы хотите все привести?
 в исканиях.

Оффлайн Dinara

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 28
  • +0/-0
  • 0
    • Просмотр профиля
    • http://dinara.ru
while (<>) {
    if (/НАЧАЛЬНЫЙ ШАБЛОН/ .. /КОНЕЧНЫЙ ШАБЛОН/) {
    # СТРОКА НАХОДИТСЯ МЕЖДУ НАЧАЛЬНЫМ
    # И  конечным шаблоном включительно
    }

}

 - так написано в Perl CookBook, и в документации по ActivePerl

вроде все понятно, но не представляю, как использовать
Должно работать© - ритуальная фраза, которую произносят программисты, когда сами не понимают, что сделали.

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
хы
« Ответ #6 : 08 Января 2002, 03:07:21 »
примерчик:

#!/usr/bin/perl
my $text= qq~
тут всякая чушь, ляляляляля
bla-bla-bla
bla-bla-bla

тут чушь продолжается
~;

#Создадим файлик
open (TXT, ">text.txt") or die ("Can\'t open? reason $!");
print TXT $text;
close TXT;
#А теперь считаем и выведем то что нужно:

open (TXT, "while(){
$content .=$_ if /<[\\w\\d]+>/ .. /<\\/[\\w\\d]+>/;
}
close TXT;   

#Сейчас тут все что между тегами и сами теги
#Удалим их
$content=~s/<.*?>//g;
print $content;
 в исканиях.

Оффлайн Dinara

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 28
  • +0/-0
  • 0
    • Просмотр профиля
    • http://dinara.ru
Спасибо Вам большое за желание помочь!

Еще примечание: обрабатываемые тексты весьма аккуратны, быть там не может лишней чуши, все чинно и благородно.

Зачем это надо все: будет использоваться для движка сайта, этот файл - настроечный для каталога. Поэтому оттуда разными модулями программы должны будут выдираться только определенные теги.
Должно работать© - ритуальная фраза, которую произносят программисты, когда сами не понимают, что сделали.

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
Цитировать
Еще примечание: обрабатываемые тексты весьма аккуратны, быть там не может лишней чуши, все чинно и благородно.

это я так к слову, надо же было что-то написать ;)
Цитировать
Зачем это надо все: будет использоваться для движка сайта, этот файл - настроечный для каталога. Поэтому оттуда разными модулями программы должны будут выдираться только определенные теги.

хитро, ничего не скажешь..
правда мне кажется - не очень хорошо в смысле быстродействия, надо весь текст обрабатывать пока не найдется нужная запись.. может стоит все это хранить более упорядоченно, чтоб избегать излишних процедур обработки?
Цитировать
Спасибо Вам большое за желание помочь!

;) так мы достигли желаемого результата? Или еще нет?
 в исканиях.

Оффлайн Dinara

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 28
  • +0/-0
  • 0
    • Просмотр профиля
    • http://dinara.ru
Еще нет, :-((

Насчет хранения - да, согласна. Но сначала хотя бы так надо сделать.

А как Вы предлагаете?
Должно работать© - ритуальная фраза, которую произносят программисты, когда сами не понимают, что сделали.

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
Цитировать
Еще нет, :-((

а что еще нужно?
по идее, используя любой из вышеприведенных примеров можно выдрать содержимое _конкретного тега_
например:

#!/usr/bin/perl

my $content=&get_me_content(\'TAG1\');

sub get_me_content {
my $tag=shift;
undef $/;
open (TXT, "my $text=;
close TXT;
if ($text=~/<$tag>([\\w\\W]+)<\\/$tag>/){
return $1; #тут я маленько подправил
}
}

Таким образом можно даже выдернуть содержимое одновременно из нескольких тегов ;)

Цитировать
А как Вы предлагаете?

а смотря что там будет храниться: если опции для внутреннего использования (пути к папкам, урлы, использовать flock или нет), то имеет смысл завести файл my.cfg и подключать его в начале скриптов.
Если там будут шаблоны для генерации страниц, то можно воспользоваться чем-то вроде FastTemplate или сделать нечто аналогичное.
На худой конец, можно организовать это ка CSV базу, т.е. писать в спец. файл так:

опция|значение
опция|значение
и т.д.
 в исканиях.

Оффлайн Dinara

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 28
  • +0/-0
  • 0
    • Просмотр профиля
    • http://dinara.ru
Спасибо за этот пример! Думаю, это то, что надо!

Эх, я так боюсь регулярных выражений..... и программирования вообще. Чувствую себя такой маленькой в этом громенном мире больших и великих программистов....

А что такое FastTemplate?

У меня должно быть так:
в папке должен храниться конф файл для нее. Там будет название папки (раздела сайта), шаблон для нижележащих страниц и опции настройки меню.

Вся эта лабуда от того, что сайт-то один, а вот подсайтов на нем уже два, на одном из сайтов каждый раздел отличается от другого способом вывода меню (где-то важны названия страниц, где-то - голые даты).
Должно работать© - ритуальная фраза, которую произносят программисты, когда сами не понимают, что сделали.

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
ж)
« Ответ #12 : 08 Января 2002, 04:08:58 »
Цитировать
А что такое FastTemplate?

перевод документации:
http://www.webscript.ru/stories.php3?story=01/04/30/0683549
легкий, маленький модуль-шаблонизатор.
Цитировать
в папке должен храниться конф файл для нее. Там будет название папки (раздела сайта), шаблон для нижележащих страниц и опции настройки меню

а может стоит сделать и общий конфиг (параллельно с локальными), например в нем были бы прописаны все пути, в том числе и к директории со всеми шаблонами, а в локальном - имя шаблона.
а то по каждой категории все раскидывать - потом долго собирать..
 в исканиях.

Оффлайн Dinara

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 28
  • +0/-0
  • 0
    • Просмотр профиля
    • http://dinara.ru
Ой, это слишком сложно так сразу. Мне проще пока так сделать.

Спасибо за помощь, я буду разбираться с этим завтра(сегодня). Посмотрите потом мой код на предмет совсем уж ламерских мест?
Должно работать© - ритуальная фраза, которую произносят программисты, когда сами не понимают, что сделали.

Оффлайн Green Kakadu

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 2757
  • +1/-0
  • 0
    • Просмотр профиля
    • http://gnezdo.webscript.ru
да
« Ответ #14 : 08 Января 2002, 17:44:25 »
Цитировать
Посмотрите потом мой код на предмет совсем уж ламерских мест?

;) да я и сам то в общем-то (тихо, по секрету: л@мер)
 
Цитировать
Мне проще пока так сделать.

разумно - вначале как сможешь, а потом улучшаешь по воз-ти.

Насчет кода:

ключ -w
use strict;
;) и другие ламеры тебя такой не посчитают, да и код будет корректней с программной точки зрения.
Цитировать
я так боюсь регулярных выражений..... и программирования вообще. Чувствую себя такой маленькой в этом громенном мире больших и великих программистов....

тут ты не одинока, НЕпрограммистов тут тьма, например
Я
NAS, который тут главный
;) главное правильно притворяться - программеры, они ведь такие доверчивые:
 if (true){print \'OK!\';}
 в исканиях.

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28