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

Steffen Schwigon ss5 at renormalist.net
Do Aug 14 06:54:33 PDT 2008


Steffen Schwigon <ss5 at renormalist.net> writes:
> Macht Aristotle vielleicht genau das? Jetzt guck ich doch mal ...

Ah, ich glaub nicht. Hier daher noch zwei Varianten von mir.

Die erste macht erstmal alles in einem Rutsch, Keys nach Größe
sortiert:

  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=\"#\">";
  
  my $search = join '|', reverse sort {length $a <=> length $b } @keywords;
  $text =~ s!($search)!<a href="#">$1</a>!gi;
  
  print $text,"\n";

Hierbei brauchst Du z.B. den "negative zero-width look-behind" nicht,
you know, dieses komische "(?<!>)".

Und da ich annehme, dass Du für die hrefs noch ein Mapping abhängig
vom Keyword haben wirst, hier noch eine Variante mit /e für die rechte
Seite:

  my %keywords = ("Affe"          => '/affe.html',
                  "Hund"          => '/hund.html',
                  "Affe klettert" => '/kletteraffe.html',
                  "Hund rennt"    => '/rennhund.html'
                 );
  my $text = "Ein Affe klettert, weil er ein Affe ist. Ein Hund rennt,
  weil er ein Hund ist.";
  my $link = "<a href=\"#\">";
  
  my $search = join '|', reverse sort {length $a <=> length $b } keys %keywords;
  $text =~ s!($search)!'<a href="'.$keywords{$1}.'">'.$1.'</a>'!ge;
  
  print $text,"\n";


Mit /e kannst/musst Du rechts einfach den String selbst zusammenbauen,
/e wie "eval bei substitute".

Hier krieg ich das non-casesesitive aber nicht einfach hin, weil das
gematchte Keyword sonst nicht im Hash passen muss. Da brauchst Du
vermutlich noch ein CPAN-Modul für case-insensitive Hashes, z.B.

  http://search.cpan.org/~cjm/Tie-CPHash/lib/Tie/CPHash.pm


Hab ich was vergessen, bei diesem "sort by length"-Ansatz?

Kind regards,
Steffen 
-- 
Steffen Schwigon <ss5 at renormalist.net>
Dresden Perl Mongers <http://dresden-pm.org/>
Deutscher Perl-Workshop <http://www.perl-workshop.de/>


Mehr Informationen über die Mailingliste Dresden-pm