[Dresden-pm] Reguläre Ausdrücke - Suchen und Ersetzen von Worten

Steffen Schwigon ss5 at renormalist.net
Do Aug 14 06:31:45 PDT 2008


"Thomas Rittsche" <thomas.rittsche at gmail.com> writes:
> Hallo an alle,
> ich habe mal wieder ein Problem, bei dem ich überhaupt keine Idee
> habe, wie man da rangehen könnte.
>
> Das Ziel ist es bestimmte Wörter bzw. Wortgruppen in einem Text durch
> einen Link zu ersetzen (bzw. den Link darum zu bauen). Mit einzelnen
> Wörtern ist das alles kein Problem. Die Schwierigkeit liegt in
> Wortgruppen, die selbst als Schlüsselworte definiert sind und dabei
> einzelne Schlüsselworte enthalten.
>
> Hier mal ein Beispiel zum besseren Verständnis:
>
> my @keywords = ("affe", "hund", "affe klettert", "hund rennt");
> my $text = "Ein Affe klettert, weil er ein Affe ist. Ein Hund rennt,
> weil er ein Hund ist.";
> my $link = "<a href=\"#\">";
> foreach my $keyword(@keywords) {
> 	$text =~ s/($keyword)/$link$1$\<\/a>/gi;
> }
> print $text;
>
> Ziel wäre es, Links um "affe", "hund", "affe klettert", "hund rennt"
> zu bauen. Leider baut er mir die so nur um "affe" und "hund".

Langeweile hat Aristotle auf der YAPC sicher nicht. Warum bist Du
eigentlich nicht hier, Ri^H^HThomas? :-)

Ich hab auch grade keine Lust, seine Lösung durchzulesen, aber
müsstest Du Deine Keys nicht einfach umsortieren, nach Länge?

Und noch dafür sorgen, dass Links nicht zweimal ersetzt werden?

Dein Code, leicht  modifiziert, wäre dann:

 my @keywords = ("affe", "hund", "affe klettert", "hund rennt");
 my $text = "Ein Affe klettert, weil er ein Affe ist. Ein Hund rennt,
 weil er ein Hund ist.";
 my $link = "<a href=\"#\">";
 foreach my $keyword(reverse sort {length $a <=> length $b } @keywords) {
 	$text =~ s/(?<!>)($keyword)/$link$1$\<\/a>/gi;
 }
 print $text,"\n";

Das Sort der Keywords ist vermutlich klar. Das (?<!>) ist die
Billigvariante eines Tests, dass vor dem Key kein ">" von einem Link
steht. 

Allerdings nicht sehr death-proof.

Wenn Du Dich elaborierter ausdrücken willst, musst Du wohl ein
Gesamtstatement zusammenbauen, dass alles in einem Abwasch erledigt,
z.B. zwei Seiten eines s/// konstruieren, links die Keywords, auch
nach Länge sortiert in einem (...|...|...) und rechts vielleicht eine
mit "/e" getriebene Ersetzung abhängig vom gematchten Keyword.

Macht Aristotle vielleicht genau das? Jetzt guck ich doch mal ...

Kind regards,
Steffen 
-- 
Steffen Schwigon <ss5 at renormalist.net>


Mehr Informationen über die Mailingliste Dresden-pm