kostenloser Webspace werbefrei: lima-city


Einfache Rechtschreibprüfung mit Aspell

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    gheddo

    gheddo hat kostenlosen Webspace.

    Rechtschreibpr?fung ist f?r viele Projekte interessant. Hier eine Beschreibung, wie das mit Aspell machbar ist.
    Aspell ist ein Programm, das zur Rechtschreibkorrektur als Alternative zu Ispell entwickelt wurde. Aspell ?berzeugt durch weitaus bessere Ergebnisse, wie dieser Vergleich belegt:
    [1]

    In PHP gibt es verwirrender weise zwei Kapitel in der Funktionsreferenz, die zu Aspell passen, das w?re:
    1. Aspell
    2. Pspell

    Hierbei wird ersteres als "deprecated" eingestuft und d?rfte - mit der aktuellen Aspell-Version - nicht mehr funktionsf?hig sein. Stattdessen muss in PHP das alte Interface zu Aspell (fr?her eben "Pspell") benutzt werden.
    Auf [2] findet sich ein Beispiel, wie man aspell direkt benutzt. wir wollen es aber hier bei den PHP-internen Funktionen belassen.

    Der Funktionsumfang der pspell-Funktionen reicht leider nur um einzelne W?rter zu ?berpr?fen, das geht daf?r aber relativ einfach. Dieses kleine Beispiel soll das verdeutlichen:
    <?php
    $pspell_link = pspell_new("en");

    if (pspell_check($pspell_link, "testt")) {
    echo "This is a valid spelling";
    } else {
    echo "Sorry, wrong spelling";
    }
    ?>
    (Kopiert aus der PHP-Dokumentation zu pspell )

    Hier wird gezeigt, wie wir die Funktionen benutzen m?ssen. Als erstes ben?tigen wir einen "Link" zu Aspell.
    pspell_new() gibt uns diesen zur?ck, als einzigen Parameter erwartet es, welches W?rterbuch wir verwenden wollen (Weitere Parameter sind m?glich, aber nicht n?tig, siehe die dazugeh?rige Dokumentation ).
    ?berpr?fen, ob ein Wort richtig geschrieben wurde k?nnen wir sehr einfach per pspell_check() . Was das Beispiel nicht zeigt ist, wie man m?gliche Verbesserungsvorschl?ge abrufen kann, hierzu dient pspell_suggest() .
    Das w?ren somit alle Funktionen, die wir brauchen um einen Text zu ?berpr?fen.
    (Auf die Funktionen um eigene W?rterb?cher zu verwalten werde ich hier nicht eingehen)

    Nur einzelne W?rter zu ?berpr?fen wird auf die Dauer ?de, weshalb wir versuchen werden dem Pspell-Interface auch ganze Texte unter zuschieben. Da dies mit den PHP-Funktionen nicht m?glich ist m?ssen wir hierzu etwas tricksen. Am einfachsten und einleuchtensten ist es, wenn wir unseren Text vorab in einzelne W?rter zerlegen. Hierzu verwende ich die Funktion preg_split() .
    Der Parameter "PREG_SPLIT_DELIM_CAPTURE" bringt preg_split() dazu auch den Regex, der als Trenner verwendet wird mit in das resultierende Array aufzunehmen (insofern er eingeklammert ist). Als Trenner m?ssen wir jegliche Satzzeichen, Sonderzeichen, Klammern und auch Zahlen verwenden. Ein einfacher Trenner s?he so aus:
    $word_separator = "0-9\\.,;:!\\?\\-\\|\s\"'\\[\\]\\{\\}\\(\\)\\/\\\\";
    (Ohne Klammern o.?., da diese fix sind und somit fest in der preg_split()-Anweisung stehen k?nnen.)
    siehe auch: [3]
    ("\W" unterst?tzt leider keine Umlaute, zumindest hat das bei mir nicht geklappt)

    Nun splitten wir unseren Text auf:
    $words = preg_split('/([' . $word_separator . ']+)/', $text, -1, (PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY));
    Als Variable, die den Text enth?lt wird hier $text verwendet, der Parameter "PREG_SPLIT_NO_EMPTY" sorgt daf?r, dass keine leeren Arrayelemente erzeugt werden.

    Nun haben wir einen Array, der alle W?rter und die dazwischenliegenden Zeichen enth?lt. Alle W?rter in diesem Array m?ssen wir nun einzeln an pspell_check() ?bergeben und gegebenenfalls an pspell_suggest(), insofern ein Rechtschreibefehler vorliegt.
    Leider sind die einzelnen Arrayelemente nicht als Wort oder "Trenner" markiert, weshalb wir ein zweites Mal sortieren m?ssen. Hierzu gehen wir alle Elemente mit einem foreach() durch und testen diese wieder mit unserem $word_sepatator.
    if (preg_match('/([' . $word_separator . ']+)/', $word)) { ...Trenner... } else { ...Wort... }

    In eine Schleife zusammengefasst k?nnte das so aussehen:
    (sehr einfach)
    <?php
    foreach($words as $word)
    {
    if (!preg_match('/([' . $word_separator . ']+)/', $word))
    {
    if (!pspell_check($pspell_link, $word))
    {
    die('"' . $word . '" ist falsch geschrieben, m?gliche Verbesserung: ' . implode(', ', pspell_suggest($pspell_link, $word));
    }
    }
    }
    ?>

    Nat?rlich ist ein Programmabbruch selten erw?nscht, deswegen w?re es sinnvoll
    den Array so zu ver?ndern, dass er danach sinnvoll weiterbearbeitet werden
    kann. Hierbei fand ich folgenden Aufbau sinnvoll:
    $words[$id]['word'] => eigentliches Wort
    $words[$id]['check'] => Resultat von pspell_check() (bei Trennern immer TRUE)
    $words[$id]['suggest'] => Resultat von pspell_suggest() (falls n?tig)

    Eine Schleife die einen solchen Array erzeugt s?ge folgenderma?en aus:
    $words = preg_split('/([' . $this->WORD_SEPARATOR . ']+)/', $text, -1, (PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY));
    foreach($words as $key => $value)
    {
    $words[$key] = array();
    if (preg_match('/([' . $this->WORD_SEPARATOR . ']+)/', $value))
    {
    $words[$key]['word'] = $value;
    $words[$key]['check'] = TRUE;
    }
    else
    {
    $words[$key]['word'] = $value;
    if (pspell_check($pspell_link, $words[$key]['word']))
    {
    $words[$key]['check'] = TRUE;
    }
    else
    {
    $words[$key]['check'] = FALSE;
    $words[$key]['suggest'] = pspell_suggest($pspell_link, $words[$key]['word']);
    }
    }
    }

    Die Weiterverarbeitung des Arrays ?berlasse ich nun den geduldigen, experimentierfreudigen Lesern. ;-)

    Ein Beispiel zur Rechtschreibpr?fung findet ihr unter:
    [4]
    (Funktioniert im IE nicht richtig, das war nur ein Test in eigener Sache)
    Der Source dazu:
    [5]
    [6]
    (Ich kann nicht versprechen, dass das lange online sein wird. Sollte es irgendwann einmal nicht mehr erreichbar sein schreibt mir eine Email und ich aktualisiere die URL o.?.)
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. k*********2

    Dieses Thema wurde mit folgender Begr?ndung von kenny197902 geschlossen:

    Langsam werdens doch zuviele Tutorials zum Schlie?en. Den Grund solltest du anhand der anderen Tutorials hier kennen!

    (Dies ist eine automatische Antwort durch das System).
  4. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!