Inneren Textteil gewinnen
am 28.02.2007 15:57:19 von unknownPost removed (X-No-Archive: yes)
Post removed (X-No-Archive: yes)
* Stefan Ram wrote in de.comp.lang.perl.misc:
> Um den inneren Text aus "..." zu ermitteln verwende ich:
>
> $text =~ m{^(.*)$};
> $text = $1;
>
> Auf eine Prüfung »if( $text =~ m{^(.*)$} ){ $text = $1; }«
> habe ich bewußt verzichtet. Abgesehen davon, bitte ich um Hinweise,
> falls diese beiden Zeilen nicht der übliche gute Stil sein sollten,
> um die umgebenden Textteile "" und "" zu entfernen.
Mich dünkt es wäre leichter
$text =~ s{^(.*)$}{$1};
zu schreiben.
--
Björn Höhrmann · mailto:bjoern@hoehrmann.de · http://bjoern.hoehrmann.de
Weinh. Str. 22 · Telefon: +49(0)621/4309674 · http://www.bjoernsworld.de
68309 Mannheim · PGP Pub. KeyID: 0xA4357E78 · http://www.websitedev.de/
Stefan Ram wrote:
> Um den inneren Text aus "..." zu ermitteln verwende ich:
>
> $text =~ m{^(.*)$};
> $text = $1;
>
> Auf eine Prüfung »if( $text =~ m{^(.*)$} ){ $text = $1; }«
> habe ich bewußt verzichtet. Abgesehen davon, bitte ich um Hinweise,
> falls diese beiden Zeilen nicht der übliche gute Stil sein sollten,
> um die umgebenden Textteile "" und "" zu entfernen.
Wieso, willst Du einen Schönheitspreis gewinnen?
TMTOWTDI
Ich würde es so machen:
$text =~ s|^(.*)$|$1|;
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Stefan Ram wrote:
> Um den inneren Text aus "..." zu ermitteln verwende ich:
> $text =~ m{^(.*)$};
> $text = $1;
> Auf eine Prüfung »if( $text =~ m{^(.*)$} ){ $text = $1; }«
> habe ich bewußt verzichtet. Abgesehen davon, bitte ich um Hinweise,
> falls diese beiden Zeilen nicht der übliche gute Stil sein sollten,
> um die umgebenden Textteile "" und "" zu entfernen.
Hier kann imho 'greedy match' schnell schiefgehen,
vgl.:
use strict;
use warnings;
my $tagsoup='
<1> auf eine Zeile
<2a> zwei auf einer Zeile <2b> zwei pro Zeile
<3> auf zwei
Zeilen
<4a> auf
drei ganzen
Zeilen und dahinter <4b> dahinter
';
my $rg = qr{(.*?)}ims;
print "$1\n" while $tagsoup =~ /$rg/g;
Viele Grüße
Mirco
Mirco Wahab wrote:
> Stefan Ram wrote:
>> Um den inneren Text aus "..." zu ermitteln verwende ich:
>> $text =~ m{^(.*)$};
>
> Hier kann imho 'greedy match' schnell schiefgehen,
IMHO nicht, mit den ^ und $ ;)
Mirco Wahab wrote:
> Stefan Ram wrote:
>> Um den inneren Text aus "..." zu ermitteln verwende ich:
>> $text =~ m{^(.*)$};
>> $text = $1;
>> Auf eine Prüfung »if( $text =~ m{^(.*)$} ){ $text = $1; }«
>> habe ich bewußt verzichtet. Abgesehen davon, bitte ich um Hinweise,
>> falls diese beiden Zeilen nicht der übliche gute Stil sein sollten,
>> um die umgebenden Textteile "" und "" zu entfernen.
>
> Hier kann imho 'greedy match' schnell schiefgehen,
> vgl.:
Deswegen hier ein Beispiel, wie ich das üblicherweise mit der
Holzhammermethode mache:
#XPath does NOT work: returns 'text' instead of $node,
# IF '
Post removed (X-No-Archive: yes)
* Stefan Ram wrote in de.comp.lang.perl.misc:
>Bjoern Hoehrmann
>>$text =~ s{^(.*)$}{$1};
>
> Ich danke für Deine Antwort und die anderen Antworten!
>
> Meine beiden Zeilen kamen mir irgendwie zu umständlich
> vor (deswegen fragte ich), aber ich kam selber nicht
> auf die kürzere Lösung.
>
> Es liegt wahrscheinlich daran, daß ich mehrere Teile
> folgendermaßen extrahiere:
>
> $text =~ m{^(.*)(.*)$};
> my $bold = $1;
> my $ital = $2;
Das wäre dann
my ($bold, $ital) = m{^(.*)(.*)$};
--
Björn Höhrmann · mailto:bjoern@hoehrmann.de · http://bjoern.hoehrmann.de
Weinh. Str. 22 · Telefon: +49(0)621/4309674 · http://www.bjoernsworld.de
68309 Mannheim · PGP Pub. KeyID: 0xA4357E78 · http://www.websitedev.de/
Post removed (X-No-Archive: yes)
Stefan Ram schrieb:
> Um den inneren Text aus "..." zu ermitteln verwende ich:
>
> $text =~ m{^(.*)$};
> $text = $1;
Warum nimmste nicht HTML::Parser?
$o = MyHtmlParser->new();
my ($title,
$meta_keywords,
$meta_description,
$meta_robots,
$words,
$links,
$cached)= $o->analyze($html);
Beispiel siehe
http://www.augos.com/temp/MyHtmlParser.pm
Grüße,
Joachim
Stefan Ram:
>> $text =~ m{^(.*)$};
>> $text = $1;
Dir ist aber schon klar, was du damit bei einem Text wie
Ein Testdernichtwirklichgutgehen wird
bekommen wirst?
..* ist gefährlich, weil es _alles_ matcht, auch .., die
innerhalb des zu matchenden Strings mehrfach auftauchen.
Hier wäre die Verwendung von
(.*?)
wohl der sichere Weg. Aber auch dein Ansatz kann durchaus
passen, es hängt nur ab, wie der zu durchsuchende Text aussieht
(d.h., wenn du ausschließen kannst, dass innerhalb einer Zeile
... mehrfach vorkommt, dann ist dein Ausdruck auch
ok). Ich wollte nur auf diese Falle aufmerksam machen.
Der Vorschlag von Björn wäre dann entsprechend in
$text =~ s{(.*?)}{$1}g;
abzuändern.
LG, Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at
Hallo Stefan,
> Um den inneren Text aus "..." zu ermitteln verwende ich:
>
> $text =~ m{^(.*)$};
> $text = $1;
>
> Auf eine Prüfung »if( $text =~ m{^(.*)$} ){ $text = $1; }«
> habe ich bewußt verzichtet. Abgesehen davon, bitte ich um Hinweise,
> falls diese beiden Zeilen nicht der übliche gute Stil sein sollten,
> um die umgebenden Textteile "" und "" zu entfernen.
Bei so kleinen HTML-Snippets lohnt sich das vielleicht noch nicht, aber
bei größeren (oder kompletten Dokumenten) habe ich sehr gute Erfahrungen
mit HTML::TreeBuilder bzw. HTML::TreeBuilder::XPath gemacht. Gerade
letzteres erlaubt Dir eine supereinfache Suche nach bestimmten
Elementen. Das ganze ist fast selbstdokumentierend (solange man etwas
XPath beherrscht).
Ich verwende das zum Beispiel um die Ausgabe von Text::Restructured nach
meinen Wünschen anzupassen (Body heraustrennen, Überschriften neu
nummerieren usw.)
Allerdings steigt HTML::TreeBuilder::XPath bei falsch genesteten Tags
aus. (Ich weiß jetzt nicht mehr, ob HTML::TreeBuilder damit noch
zurechtkam.)
Tschüs, Uwe
--
http://www.perl-uwe.de/ - Tipps und Tricks zu Perl und CPAN-Modulen
Uwe Voelker wrote:
> Allerdings steigt HTML::TreeBuilder::XPath bei falsch genesteten Tags
> aus. (Ich weiß jetzt nicht mehr, ob HTML::TreeBuilder damit noch
> zurechtkam.)
Das ist z.B. das Problem, wenn Du sehr viele, fremde HTML-Seiten parst.
Da kannst Du nicht auf fast garnichts verlassen, weshalb ich dafür ein
recht umfangreiches Musterscript aus Regular Expressions verwende, die
ich nach Bedarf auskommentiere oder abändere.
Hängt natürlich auch alles vom angestrebten Zweck ab. Wenn die
ausgelesenen Daten nicht 100% vollständig sein müssen, kann es sich z.B.
bewähren, mittels Regex sehr enge Filter zu bauen, welche nur die
interessanten Strings auslesen, und den Rest ignorieren.
Bei maschinengeneriertem HTML von guter Qualität bin ich von XPath auch
begeistert.
Helmut Wollmersdorfer
Robert Sedlacek:
>> Hier kann imho 'greedy match' schnell schiefgehen,
>
> IMHO nicht, mit den ^ und $ ;)
Das setzt aber voraus, dass jede Zeile nur genau einmal
...
(vorher und nachher nichts) enthält.
LG, Ferry
--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at
Ferry Bolhar wrote:
> Robert Sedlacek:
>>>Hier kann imho 'greedy match' schnell schiefgehen,
>>
>>IMHO nicht, mit den ^ und $ ;)
>
> Das setzt aber voraus, dass jede Zeile nur genau einmal
>
> ...
>
> (vorher und nachher nichts) enthält.
Genau so hatte der OP das Problem nunmal beschrieben.
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Ferry Bolhar wrote:
> Robert Sedlacek:
>
>>> Hier kann imho 'greedy match' schnell schiefgehen,
>> IMHO nicht, mit den ^ und $ ;)
>
> Das setzt aber voraus, dass jede Zeile nur genau einmal
>
> ...
>
> (vorher und nachher nichts) enthält.
>
> LG, Ferry
Das war die Version des OPs, insofern: Eben.
--
# Robert 'phaylon' Sedlacek
# Perl 5/Catalyst Developer in Hamburg, Germany
{ EMail => ' rs@474.at ', Web => ' http://474.at ' }
Post removed (X-No-Archive: yes)