simon: Lange Wörter rausfiltern

Hallo,

ich würde gerne aus einem HTML-Quellcode lange Wörter rausfiltern. Bisher mache ich das so:

$maxwortlaenge = 30;
$string =~ s/(\S{$maxwortlaenge})\S*/$1<b>...</b>/g;

So ersetze ich alle Wörter die länger als 30 Zeichen sind gegen "<b>...</b>". Mein Problem ist nun das ich auch lange HTML-Tags mitersetze.

Beispiel:
"<a href="laaange30zeichen"> link </a>" wird zu "<a <b>...</b> link </a>" weil "href="laaange30zeichen">" als ein Wort angesehen wird.

Wie kann ich denn Lange Wörter finden, und keine HTML-Befehle?

Vielen Dank im Voraus

  • simon
  1. Lieber simon,

    Wie kann ich denn Lange Wörter finden, und keine HTML-Befehle?

    was befiehlt man denn in HTML? IF (<ul>) { <a href="">; } ELSE { <img src="" /> } ...oder wie?

    Wenn Dein Suchmuster HTML-Tags nicht matchen soll, dann verbiete doch das Vorkommen von spitzen Klammern! Das kriegst Du sicherlich hin.

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    1. Hallo,

      Wie kann ich denn Lange Wörter finden, und keine HTML-Befehle?
      was befiehlt man denn in HTML? IF (<ul>) { <a href="">; } ELSE { <img src="" /> } ...oder wie?

      Wenn Dein Suchmuster HTML-Tags nicht matchen soll, dann verbiete doch das Vorkommen von spitzen Klammern! Das kriegst Du sicherlich hin.

      Da hab ich mich wohl ein wenig falsch ausgedrückt. Ich habe einen ganz normalen HTML-Code. Ich möchte einfach das in diesem HTML-Code keine Wörter vorkommen, die länger als X Zeichen sind.

      Also muss ich expliziet nach Wörtern und nicht nach HTML-Befehlen suchen. Und da weiß ich nicht wirklich wie ich das anstellen soll... ?

      Nun verständlicher? Jemand eine Idee?

      • Simon
      1. Hell-O!

        Ich habe einen ganz normalen HTML-Code. Ich möchte einfach das in diesem HTML-Code keine Wörter vorkommen, die länger als X Zeichen sind. Also muss ich expliziet nach Wörtern und nicht nach HTML-Befehlen suchen. Und da weiß ich nicht wirklich wie ich das anstellen soll... ?

        Wörter zeichnen sich im RegExp-Jargon dadurch aus, dass vor und nach ihnen eine sog. Wortgrenze steht. Diese wird mittels '\b' notiert. Woraus deine Wörter bestehen dürfen, musst du selber wissen und diese erlaubten Zeichen in einer Zeichenklasse zusammenfassen. Für die Begrenzung der Anzahl stehen dir Quantifier zur Verfügung, die du innerhalb geschweifter Klammern notierst. Das ergibt bis hierher:

        /\b([a-zA-ZäöüßÄÖÜ]{30,})\b/

        Was der Ausdruck nicht berücksichtigt, sind Konstrukte der Art <p>Text</p>, sie werden als als 1 Wort gezählt. Hier hast du mehrere Möglichkeiten. Entweder du eliminierst alle HTML-Tags, bevor du die Wortlänge testest, oder du verbesserst den regulären Ausdruck. Du könntest so herangehen, dass ein Wortanfang endweder durch eine Wortgrenze oder '>' gekennzeichnet ist, beim Wortende wäre dies die spitze Klammer auf ('<'). Alternativen musst du innerhalb einer Klammer durch ein '|' getrennt notieren. Somit sähe der RegExp bis hierhin so aus:

        /(\b|>)([a-zA-ZäöüßÄÖÜ]{30,})(\b|<)/

        Nun ist es an dir, die Zeichenklasse zu verfeinern (denke insbesondere an maskierte Sonderzeichen), eine Ersetzung zu formulieren, dir zu überlegen, welche Modifier du einsetzen musst bzw. solltest, und wie du das Ganze letztlich in dein Perlscript bekommst. Hierbei hilft dir SELFHTML mit dem Kapitel über Reguläre Ausdrücke weiter.

        Ein Hinweis noch zum Schluss:
        Auf meinem Testsystem gehört das '=' mit zu den Wortbegrenzern (ich weiß nicht, ob das überall so ist), weshalb du Probleme bei Elementattributen bekommen könntest. Abhilfe schafft, die Wortgrenzen umzuformulieren. Dabei musst du festlegen, was für Zeichen am Wortanfang bzw. -ende vorkommen dürfen und welche nicht. Bei mir sähe es so aus:

        (>|\n|\r\n|\r|\s|^)([a-zA-ZäöüßÄÖÜ]{30,})(<|\n|\r\n|\r|\s|$)

        Getestet, funktioniert.

        Siechfred

        1. Hallo,

          vielen Dank schon mal an alle für die ausführliche Hilfe.
          Irgendwie bekomme ich es aber trotzdem nicht hin :(. Hier ist ein kleines Bsp. meines Quellcodes:

          <a class="eintrag" href="http://forum.de.selfhtml.org/selfhtml/selfhtml/selfhtml/" target="_blank">http://forum.de.selfhtml.org/selfhtml/selfhtml/selfhtml/</a>

          Mit diesem Ausdruck:
          $string =~ s/([a-zA-Z0-9äöüßÄÖÜ/:.]{30,})/$1<b>...</b>/g;

          Wird das ganze zu:
          <a class="eintrag" href="http://forum.de.selfhtml.org/selfhtml/selfhtml/selfhtml/<b>...</b>" target="_blank">http://forum.de.selfhtml.org/selfhtml/selfhtml/selfhtml/<b>...</b></a>

          Gefunden wird es also schon mal. Nur leider hab ich es nicht hinbekommen das die URL im Link nicht zerstört wird. Habe auch alle anderen Vorschläge ausprobiert, jedoch leider alle ohne Erfolg.

          Vielleicht ist ja jemand bereit mir nochmal zu helfen...

          Vielen Dank

          • simon
          1. Irgendwie bekomme ich es aber trotzdem nicht hin:
            [...]
            $string =~ s/([a-zA-Z0-9äöüßÄÖÜ/:.]{30,})/$1<b>...</b>/g;

            Woran soll dein Script erkennen, wo die Wortgrenzen sind? Hast du mein Posting überhaupt vollständig gelesen?

            Siechfred

  2. gudn tach!

    ich würde gerne aus einem HTML-Quellcode lange Wörter [die nicht in tags vorkommen] rausfiltern. Bisher mache ich das so:

    $maxwortlaenge = 30;
    $string =~ s/(\S{$maxwortlaenge})\S*/$1<b>...</b>/g;

    du kannst versuchen diesen tipp fuer php in/fuer/nach (was ist hier richtig?) perl zu uebersetzen.

    als hilfe fuer perl-regexp empfehle ich: <http://perldoc.perl.org/perlre.html@perldoc perlre>

    eine andere moeglichkeit ist es, diesen tipp fuer php zu uebersetzen.

    prost
    seth

    1. gudn tach!

      als hilfe fuer perl-regexp empfehle ich: perldoc perlre

      hmmpf, normalerweise benutze ich ja die vorschau auch nach aenderungen nach einer vorschau. mit "title=" sieht's gleich viel besser aus...

      dafuer nun noch ein dritter tipp:
      HTML::Parser

      prost
      seth