Немогу вытащить текст из тегов которые расположены
не в одной строке, например:
<h1> text text,
text some text,
text
text
text text </h1>
Только надо вытаскивать весь текст ?
>Немогу вытащить текст из тегов которые расположены
>не в одной строке, например:
><h1> text text,
>text some text,
>text
>text
>text text </h1>
>Только надо вытаскивать весь текст ?Поищи на CPAN модули парсинга HTML, простой регексп здесь не поможет.
perldoc HTML::SimpleParse
или perldoc HTML::Parser
Почему это regexp "не поможет"?
Тебе же не далее как дней десять назад ilya подсказал ход мыслей в подобных ситуациях...
>Почему это regexp "не поможет"?
>
>
>Тебе же не далее как дней десять назад ilya подсказал ход мыслей
>в подобных ситуациях...я пробовал этот вариант, но он подходит только для одинарных тэгов типа <meta ...>, а если брать два тэга, то только выдирает один раз. Может что-то не то я делал.
> я пробовал этот вариант, но он подходит только для одинарных тэгов типа <meta ...>, а если брать два тэга, то только
>выдирает один раз. Может что-то не то я делал.
Если тэг на стр встречается несколько раз
Надо собрать их в массив. Потом разбирать массив...
Напр. в той программке от konst перед всеми
$notfull = "";
вставить
push(@rez,$rez);
$notfull = "";а в конце вместо print ..
print "TAG = $tag\n";
foreach $r (@rez) {
++$i;
print "$i: $r \n";
}
>Почему это regexp "не поможет"?Помочь может лишь достаточно сложный комплекс регекспов, и то при условии - неделя на штудирование стандартов w3, неделя на непонимание почему не всегда работает и месяц на отладку и поиск исключений из правил :-)
>Немогу вытащить текст из тегов которые расположены
>не в одной строке, например:
><h1> text text,
>text some text,
>text
>text
>text text </h1>
>Только надо вытаскивать весь текст ?
>
=== + можно напр. так ===
$fn = $ARGV[0]; # $fn = 'htm-file';
$tag = $ARGV[1]; # $tag = 'h1';
open(FN,$fn) || die "$!\n";
while(<FN>) {
chomp;
if (/<$tag[^>]*>(.*?)(<\/$tag>)?(.*)$/i) {
unless ($2) {
$rez = $3;
$notfull = " ";
} else {
$rez = $1;
$notfull = "";
}
next;
}
if ($notfull) {
if (/^(.*?)<\/$tag>/i) {
$rez .= " ". $1;
$notfull = "";
} else {
$rez .= " ". $_;
}
next;
}
}
print "within those tags \"$tag\" text = $rez\n";
#!/usr/bin/perl
$str=<<"TEXT";
<h1> text text,
text some text,
text
text
text text </h1>
TEXT
$tag="h1";
$str=~m/<$tag>(.*?)<\/$tag>/is;
print $1;
Спасибо большое! то что надо, токо этот код вытаскивает первое нахождение, а как вытащить все строки заключённые в тэги <h1> по всему документу ?
>Спасибо большое! то что надо, токо этот код вытаскивает первое нахождение, а как вытащить все строки заключённые в тэги <h1> по всему документу ?
Добавь в конце регекспа модификатор g
Например
$tag="h1";
$str=~s/<$tag>(.*?)<\/$tag>/$1/sg;
>Добавь в конце регекспа модификатор g
>Например
>$tag="h1";
>$str=~s/<$tag>(.*?)<\/$tag>/$1/sg;
Этот код удаляет тэги со всей строки, а надо что-бы забирался только текст
внутри тэга например <h1> .... </h1> !?
>>Добавь в конце регекспа модификатор g
>>Например
>>$tag="h1";
>>$str=~s/<$tag>(.*?)<\/$tag>/$1/sg;
>
>
>Этот код удаляет тэги со всей строки, а надо что-бы забирался только
>текст
>внутри тэга например <h1> .... </h1> !?
$str=~s/.*?<$tag>(.*?)<\/$tag>.*/$1/sg;
Может кому-то пригодится, самое правильно то это делается так:undef $/;
open(G,"index.html");
$data=<G>;
close(G);
$/="\n";
$tag="h1";
while($data=~m/(<$tag>)(.*?)(<\/$tag>)/isg)
{
$h1=$2;
push(@mastags,$h1);
}
print @mastags;
# Тема закрыта !