Siechfred: Lange Wörter rausfiltern

Beitrag lesen

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