PHP a ortografia - pspell
W tym artykule dowiemy się jak sprawdzać pisownie wyrazów w PHP przy użyciu pspell. Interfejs pspell używa darmowej biblioteki aspell. Biblioteka ta zawiera wiele jezyków także polski.
Instalacja
Na początku należy zainstalować bibliotekę aspell (aspell.net), wraz z odpowienim językiem. Następnie należy skompilować php z --with-pspell (to w systemach uniksowych i w przypadku samodzielnej kompilacji). W windowsie należy skopiować plik aspell-15.dll z katalogu bin (z katalogu aspell) do folderu gdzie PHP może go odnaleźć (np. c:windowssystem32).
No to zaczynamy
Rozpoczniemy od załadowania standardowego słownika polskiego i ustaleniu pewnych parametrów działania. Pamiętajmy, że musimy zachować link do słownika. Robimy to w następujący sposób.
$dict = pspell_new("pl","","","",(PSPELL_NORMAL));
Oczywiście pierwszy parametr ("pl") to kod języka. Trzy następne to po koleji: odmiana języka (np. angielski amerykański, angielski brytyjski), żargon, kodowanie. Ostatni parametr tak jak 3 poprzednie jest opcjonalny. Jest to tryb działania.
Więcej szczegółów można zobaczyć w manualu PHP, pspell_new.
Sprawdzamy pisownie
Jak sprawdzić pisownie danego wyrazu? Do tego służy funkcja pspell_check. Przyjmuje ona 2 parametry. Pierwszy jest to link do słownika, a drugi słowo do sprawdzenia. W zamian zwraca wartość logiczną. Zobaczmy jak to działa na tym prostym przykładzie.
![]()
$dict = pspell_new("pl","","","",(PSPELL_NORMAL));
if(pspell_check($dict, "słowo")){echo 'słowo - poprawne<br>';}else{echo 'słowo - niepoprawne<br>'}
if(pspell_check($dict, "ssłowo)){echo 'ssłowo - poprawne<br>'}else{echo 'ssłowo - niepoprawne<br>';}
?>
Wynik tego działania jest łatwy do przewidzenia. No ale przydałaby się jakaś pomoc. Jak powinno dane słowo zostać napisane? Do tego celu służy funkcja pspell_suggest. Zobaczmy jak ona działa.
![]()
$dict = pspell_new("pl","","","",(PSPELL_NORMAL));
var_dump(pspell_suggest($dict, 'niee');
?>
Kiedy uruchomimy ten kod przekonamy się, że funkcja zwróciła tablice wypełnioną słowami, które mogliśmy chcieć napisać.
Koncowy skrypt
Na koniec poskładajmy wszytko w jedną całość i zróbmy z tego porządny skrypt. Jego celem będzie sprawdzenie poprawności tekstu wpisanego w pole tekstowe. Skrypt zasugeruje również pewne poprawki.
Plik spellcheck.html:
<form method="post" action="check.php">
<textarea name="f_text" cols=50 rows=8></textarea>
<br><input type="submit" value="Sprawdź">
</form>
Ten kod jest oczywiście prosty, to czysty HTML. Teraz przejdźmy do zegoś trudniejszego - sprawdzanie poprawności.
Plik check.php
![]()
$dict = pspell_new("pl","", "","",(PSPELL_NORMAL));
$text = $_POST['f_text'];
echo 'Spell check'."n";
$begin = 0;
$end = strpos($text, ' ');
$checked = '';
if($end===false)exit;
do{
$word = substr($text,$begin,$end-$begin);
$safe_word= str_replace(array('.', ', ', ';', '(', ')'),'', trim($word));
if(pspell_check($dict,$safe_word)){
$checked .= $word.'';
}else{
$checked .= '<a target="_blank" href="suggest.php?word='.$safe_word.'"><span style="color:red">'.$word.'</span></a>';
}
$begin = strpos($text, ' ',$end-1);
if($begin===false)break;
$end = strpos($text, ' ',$begin+1);
if($end===false)$end = strlen($text);
}while(true);
echo $checked;
![]()
Jak to działa? Oczywiście na początku tworzone jest łącze do słownika. Potem wyszukujemy spacje i pobieramy słowo między spacją a spacją, początkiem a spacją lub spacją a końcem. Nstępnie usuwamy znaki takie jak przecinek czy kropka (przechowujemy tą wartość w zmiennej $safe_word). Dalej sprawdzamy czy słowo jest poprawne i odpowiednio to wyświetlamy.
Niepoprawne słowa bedą miały linki do pliku suggest.php gdzie zostaną wyświetlone sugerowane słowa.
suggest.php:
![]()
$dict = pspell_new("pl","","","",(PSPELL_NORMAL));
if(!isset($_GET['word']))exit;
$word = $_GET['word'];
echo '<span style="font-size:130%;">Sugestie dla słowa <b>'.$word.'</b> to:</span><br><ul>'."n".'<li>'.(implode("</li>n <li>",pspell_suggest($dict, $word))).'</li></ul>';
![]()
Tutaj wszystko także powinno być oczywiste. Przykładowy działający skrypt można zobaczyć tutaj. Niestety z racji tego, iż nasz serwer nie ma zainstalowanego polskiego słownika można testować tylko język angielski.










