snoot: RegExp Wortbegrenzung finden

Hi,

ich habe ein Suchscript, welches auf der Suchergebnisseite das gefundene Wort sowie eine bestimmte Anzahl an Zeichen bzw. Wörtern vor und nach dem Suchbegriff anzeigt. Also sowas wie

das ist Text vor dem Suchbegriff und danach auch Text

Eigentlich sollen vor und nach dem Suchbegriff nur ganze Worte ausgegeben werden, das wird mittels RegExp und \b erreicht. Leider werden Wortgrenzen nicht korrekt erkannt, wenn codierte Umlaute enthalten sind, also bspw. Oberfläche. Dort ist dann mitten im Wort scheinbar eine Wortgrenze: "OberflÃ" und "¤che". Wenn dieses Wort nun genau ganz am Anfang oder Ende meiner Ausgabe steht, wird es - wenn es insgesamt länger als der maximal auszugebende Text ist - genau in der Mitte getrennt. Ich gebe bspw. 35 Zeichen nach dem Suchbegriff aus, dann wäre "Oberfläche" hier zu lang:

das ist Text vor dem Suchbegriff und danach kommt das Wort Oberfläche

und das scheinbar letzte Wort "¤che" wird nicht angezeigt. Zurück bleibt also "OberflÃ", was einerseits natürlich ein abgeschnittenes Wort ist, andererseits ist das einzelne "Ã" am Ende zudem auch kein richtiger Umlaut mehr und foglich wird auf der Seite nur ein kryptisches Zeichen dargestellt.

Ist es möglich, dass ich nicht mit \b nach einer Wortgrenze suche, sondern einfach nach einem Leerzeichen?

Im Moment sieht es so aus:

  $len = 250;  
  if ($exp_full == 'yes') $pref = "\b";  
  if ($exp_capital == 'no') $capit = "i";  
  
  preg_match("=\b.{0,$len}($pref$search_word$pref).{0,$len}\b=s$capit", $a, $hit);

Ich habe schon versucht, den zu durchsuchenden Text $a von diesen codierten Umlauten zu befreien damit es da gar nicht erst zu Problemen kommt, aber alle Versuche mit utf8_encode etc. haben nicht den egwünschten Erfolg gebracht. Kann natürlich auch sein, dass ich damit sowieso auf dem Holzweg bin.

  1. Ist es möglich, dass ich nicht mit \b nach einer Wortgrenze suche, sondern einfach nach einem Leerzeichen?

    Ohne dass ich das umgesetzt hätte.
    Wenn du UTF Wortzeichen berücksichtigen willst, musst du deine eigene "Wordboundery" definieren, was aber streng genommen nicht geht
    Du kannst aber lookaheads und lookbehinds definieren.

    Perl:
    my $unicoderange = '\uxxxx-\uyyyy';
    my $wordchar = qr/[A-Za-z$unicoderange]/;
    my $wbstart = qr/(?<!$wordchar)/;
    my $wbend = qr/(?!$wordchar)/;

    $text =~ m/
        (?:
          ^
        |
          $wbstart .{10,20}
        )
        \Q$searchword\E
        (?:
          $
        |
          .{10,20} $wbend
        )
        /x;
    gänzlich ungetestet und gewiss mangelhaft.

    mfg Beat

    --
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    Der Valigator leibt diese Fische