toscho.design

PHP: Wörter zählen

Gegeben sei ein String (ein Text), der eventuell Markup enthält und doppelte Leerzeichen. Wir wollen die Wörter zählen. Nun gibt es sehr unterschiedliche Ansichten darüber, was ein Wort ist: Mit Abkürzungen bzw. per Apostroph verschmolzenen Worten geht’s los, Chinesisch und andere Sprachen ohne fest vorgeschriebene Leerzeichen erschweren das Problem weiterhin.

str_word_count() beispielsweise scheitert an fast allen Punkten, obendrein noch an Bindestrichen, Zahlen … und UTF-8. Man kann daran vorbeieiern, aber der Aufwand lohnt sich einfach nicht.

Bleiben wir pragmatisch, nehmen schlechtes Deutsch seufzend hin und zählen einfach die Leerzeichen, ja?
Nein. Manche Leute haben immer noch die Angewohnheit, hinter einen Punkt zwei Leerzeichen zu setzen, und im Markup tauchen sie selbstverständlich auch auf.

Also nochmal: Gegeben sei ein String …

$string = '<p class="foo bar"> hello world.  two späceß.<br />
bla</p>'

… aus dem wir erst das Markup entfernen:

$text = strip_tags( $string );

… dann die Leerzeichen am Anfang und am Ende:

$text = trim( $text );

Und jetzt entspräche die Menge der nicht aufeinanderfolgenden Leerzeichen plus eins der Menge dessen, was wir als Wörter akzeptieren. Wir müssen aber nicht addieren, sondern kleben einfach ein Leerzeichen hinten an und lassen einen trivialen regulären Ausdruck durchzählen:

$word_count = preg_match_all( '~\s+~', "$text ", $m );

Ergebnis: 5.

2 Kommentare

  1. Alex am 14.06.2012 · 15:04

    Hallo, eine wirklich gute PHP-Lösung, Bookmark gesetzt :-) Ich habe mich vor einiger Zeit im Rahmen eines größeren Projekts ebenfalls damit beschäftigt, allerdings auf Javascript-Basis. Das Prinzip ist das gleiche: Text reinigen, überflüssige bzw. doppelte Leerzeichen entfernen und diese anschließend zählen. Das Ergebnis gibts auf http://www.woerter-zaehlen.net zu sehen.

  2. Frank am 18.06.2012 · 17:31

    Hatte gerade genau dieses Problem zu lösen und dachte mir, dass mich vielleicht Tante Google zu einer Website schickt, die diesen Sachverhalt in kompetenter Weise erklärt. Besten Dank! Sehr informativ fand ich auch den Artikel: Warum UTF-8?