preg_replace_callback() is the best way I found to check words in a large text and change the HTML color of words that are not found. Here is a script I wrote which does just that, and optionally uses pspell_suggest() to auto-correct. I would love to write a better regex to ignore <text inside xml tags>, but that really isn't as easy as it sounds...
<?php
$pspell = pspell_new('en','canadian','','utf-8',PSPELL_FAST);
function spellCheckWord($word) {
global $pspell;
$autocorrect = TRUE;
// Take the string match from preg_replace_callback's array
$word = $word[0];
// Ignore ALL CAPS
if (preg_match('/^[A-Z]*$/',$word)) return $word;
// Return dictionary words
if (pspell_check($pspell,$word))
return $word;
// Auto-correct with the first suggestion, color green
if ($autocorrect && $suggestions = pspell_suggest($pspell,$word))
return '<span style="color:#00FF00;">'.current($suggestions).'</span>';
// No suggestions, color red
return '<span style="color:#FF0000;">'.$word.'</span>';
}
function spellCheck($string) {
return preg_replace_callback('/\b\w+\b/','spellCheckWord',$string);
}
echo spellCheck('PHP is a reflecktive proegramming langwage origenaly dezigned for prodewcing dinamic waieb pagges.');
?>
OUTPUT: PHP is a reflective programming language originally designed for producing dynamic Web pages.
Pspell 関数
導入
これらの関数により、単語のスペルチェックを行い、修正案を提案させる ことが可能となります。
要件
PHP を pspell サポートつきでコンパイルするには、aspellライブラリが 必要です。これは、» http://aspell.sourceforge.net/ で取得可能です。
インストール手順
PHP をコンパイルする際に、オプション --with-pspell[=dir] を追加する 必要があります。
注意: Win32 ユーザへの注意 この拡張モジュールを動作させるには、 Windows システムの PATH が通った場所に DLL ファイルが存在する必要があります。 FAQ の "Windows で PHP のディレクトリを PATH に追加するにはどうすればいいのですか?" で、その方法を説明しています。 DLL ファイルを PHP のフォルダから Windows のシステムディレクトリにコピーしても動作します (システムディレクトリは、デフォルトで PATH に含まれるからです) が、これは推奨しません。 この拡張モジュールを使用するには、以下のファイルが PATH の通った場所にある必要があります。 aspell の bin フォルダにある aspell-15.dll
Win32 は、PHP 4.3.3 以降でのみサポートします。また、 aspell バージョン 0.50 以降が必要です。
実行時設定
設定ディレクティブは定義されていません。
リソース型
リソース型は定義されていません。
目次
- pspell_add_to_personal — ユーザの単語リストに単語を追加する
- pspell_add_to_session — 現在のセッションの単語リストに単語を追加する
- pspell_check — 単語をチェックする
- pspell_clear_session — 現在のセッションをクリアする
- pspell_config_create — 辞書をオープンする際に使用する設定を作成する
- pspell_config_data_dir — 言語データファイルの場所
- pspell_config_dict_dir — メイン単語リストの場所
- pspell_config_ignore — 長さが N 文字未満の単語を無視する
- pspell_config_mode — 返される提案の数のモードを変更する
- pspell_config_personal — 個人の単語リストを保持するファイルを設定する
- pspell_config_repl — 置換候補を保持するファイルを設定する
- pspell_config_runtogether — 複合語を有効な単語の組み合わせとして考慮する
- pspell_config_save_repl — 単語リストと共に置換リストを保存するかどうかを定義する
- pspell_new_config — 指定した設定に基づき新規辞書をロードする
- pspell_new_personal — 個人の単語リストを有する新規辞書をロードする
- pspell_new — 新規辞書をロードする
- pspell_save_wordlist — 個人の単語リストをファイルに保存する
- pspell_store_replacement — 単語を置換する組を保存する
- pspell_suggest — 単語のスペルについて修正候補を示す
Pspell
dylan at wedefy dot com
19-Oct-2007 09:36
19-Oct-2007 09:36
fragment
12-Apr-2007 02:12
12-Apr-2007 02:12
To get round the error on Windows where the word list can't be found inside functions, take the call to pspell_new() out of the function and pass the return value to your function, i.e.
<?
function testSpell($pspell_link) {
echo pspell_check($pspell_link, "test") ? 'OK' : 'Not OK';
}
$pspell_link = pspell_new("en");
testSpell($pspell_link);
?>
Alan Dunsmuir<alan at moonrake dot demon dot co dot uk>
14-Mar-2007 06:28
14-Mar-2007 06:28
There appears to be a problem currently affecting PSpell functionality on Windows machines.
Currently, the compiled build of PHP5 for Windows does not by default include PSpell, and to activate these functions the Windows user has to (a) install GNU ASpell; (b) copy the file aspell-15.dll to a directory in the Windows "Path" statement (typically C:\Windows\System32); (c) install one or more ASpell dictionaries; (d) enable the PSpell extension to PHP by adding a reference to php_pspell.dll in the php.ini file, and moving the file itself to the main PHP directory.
However, when this has all been done and PSpell appears to have been fully activated, there remains a problem. While all the PSpell functions work as specified when referenced from the "main" body of PHP code, if they are placed within a PHP function, the system reports that it is unable to find any word lists for the specified dictionary (whichever one is chosen).
I have a sample of PSpell-using code (taken from the SAMS book PHP 5 In Practice) which works perfectly on a Unix-based Web Server, but which fails with the indicated error message on a range of Windows machines.
sholland at napervillegi dot com
29-Oct-2006 03:48
29-Oct-2006 03:48
Back in 10/2002 csnyder at chxo dot com wrote the first comment about the spell functions, and wrote a very sophisticated spell check with a direct call to aspell. In a similar vein, I wrote a simplified a PHP function that will spell check a string and insert tags before and after the misspelled words. Auto-correction is not offered.
<?
function spellcheck($string) {
// Entry: $string: Text to spellcheck.
// Returns: string with '<strong>' and '</strong>' inserted before and
// after misspellings.
$pre='<strong>'; // Inserted before each mis-spelling.
$post='</strong>'; // Inserted after each mis-spelling.
$string=strtr($string,"\n"," ");
// Drop newlines in string. (It bothers aspell in this context.)
$mistakes = `echo $string | /usr/local/bin/aspell list`;
// Get list or errors.
$offset=0;
foreach (explode("\n",$mistakes) as $word)
// Walk list, inserting $pre and $post strings. I move along and
// do the insertions, keeping track of the location. A global replace
// with str_replace($string,$pre.$work.$post) is problematic if the
// same misspelling is found more than once.
if ($word<>"") {
$offset=strpos($string,$word,$offset);
$string=substr_replace($string, $post, $offset+strlen($word), 0);
$string=substr_replace($string, $pre, $offset, 0);
$offset=$offset+strlen($word)+strlen("$pre $post");
};
return $string;};
?>
For this to work on your system, see if /usr/local/bin/aspell list runs from the shell. It needs to get input from standard input. You may not be able to run apell without the path for PHP because the PATH variable may be different in the PHP invocation from a shell invocation.
andrew at bluerhinos dot co dot uk
03-May-2006 07:28
03-May-2006 07:28
If you use red hat or fedora, you may need to is use
yum install pspell-devel
(fixes: configure: error: Cannot find pspell)
jeremy hepler
30-Mar-2006 05:01
30-Mar-2006 05:01
compiling php with pspell on debian sarge:
apt-get install aspell libaspell15 libaspell-dev libpspell-dev
configure php:
./configure <your other options> --with-pspell=/usr
make & install
if previous tries have failed or it is not functioning properly, unpack the php source again and configure / compile in a fresh tree
beau_scott at hotmail dot com
31-Dec-2005 06:13
31-Dec-2005 06:13
hehe, forgot to remove the echo $string line... whoops ;)
Should be:
<?
/**
* Checks spelling of $string. Whole phrases can be sent in, too, and each word will be checked.
* Returns an associative array of mispellings and their suggested spellings
* @param string $string Phrase to be checked
* @return array
*/
function checkSpelling ( $string )
{
// Make word list based word boundries
$wordlist = preg_split('/\s/',$string);
// Filter words
$words = array();
for($i = 0; $i < count($wordlist); $i++)
{
$word = trim($wordlist[$i]);
if(!preg_match('/[A-Za-z]/', $word))
continue;
$word = preg_replace('/[^\w\']*(.+)/', '\1', $word);
$word = preg_replace('/([^\W]*)[^\w\']*$/', '\1', $word);
$word = trim($word);
if(!in_array($word, $words, true))
$words[] = $word;
}
$misspelled = $return = array();
$int = pspell_new('en');
foreach ($words as $value)
if (!pspell_check($int, $value))
$misspelled[] = $value;
foreach ($misspelled as $value)
$return[$value] = pspell_suggest($int, $value);
return $return;
}
?>
Gregory Boshoff
14-May-2005 08:23
14-May-2005 08:23
If you are receiving the error message:
PSPELL couldn't open the dictionary. reason:
No word lists can be found for the language "en".
Add following lines prior to calling pspell_check:
$pspell_config = pspell_config_create("en");
$pspell_link = pspell_new_config($pspell_config);
abhishek dot ratani at gmail dot com
23-Feb-2005 07:46
23-Feb-2005 07:46
http://www.zend.com/zend/spotlight/spellchecking.php#Heading2
Great tutorial on spell checking. Check it out!
flint at modulusgroup dot com
30-Dec-2004 07:19
30-Dec-2004 07:19
For those will problems installing on Win32 with IIS:
Symptom: browser just hangs when calling pspell function. Running PHP.exe from command line causes pspell to claim that there is a corrupt file. Running Aspell works just fine on the command line.
You need new data files:
You can download and get more information about it here:
http://wiki.wordpress.org/SpellCheck
Just replace the data directory in C:\Programs Files\Aspell\ with the new data directory you downloaded.
No more problems.
11-Dec-2004 06:52
For those of us in the Windows world, here is a great link on how to enable pspell for PHP on Win32:
http://www.oblius.com/?.blogs.184
tidd
29-Sep-2004 02:31
29-Sep-2004 02:31
In response to csnyder's comment about calling aspell instead of using the aspell or pspell libs:
If you are running a low traffic site this will work fine and it's a good idea.
If, however, you have many customers using your spell checking script, this method does not scale well and you should consider spending the time to make the libs work properly.
webmaster at script-tease dot net
12-Apr-2004 11:26
12-Apr-2004 11:26
Easy way to make a spellchecker:
<?
function spellcheck ( $string ) {
$words = preg_split('/[\W]+?/',$string);
$misspelled = $return = array();
$int = pspell_new('en');
foreach ($words as $value) {
if (!pspell_check($int, $value)) {
$misspelled[] = $value;
}
}
foreach ($misspelled as $value) {
$return[$value] = pspell_suggest($int, $value);
}
return $return;
}
?>
jrweir _a_t_ yahoo
30-Mar-2004 04:15
30-Mar-2004 04:15
I had the same problems after following the detailed instructions for installing on windows but was able to solve them by doing the following:
first, I copied all the files in the data directory of the aspell install (ie. C:\Program Files\Aspell\data) to a unix machine and ran dos2unix on all of the files and then copied them back.
second, added this line before the pspell_new("en") call
pspell_config_create("en");
hope this works for you too.
kevina at gnu dot org
12-Jan-2003 07:19
12-Jan-2003 07:19
Aspell Author Here.
Since Aspell 0.50, Pspell is no longer used. It is not necessary to download and install the Pspell package, only Aspell 0.50 (or better) is required. Aspell now provided a backwards compatibility interface for programs expecting the old Pspell interface (such as PHP).
Even though Aspell now provided a new "Aspell" interface this, the PHP Pspell interface is the one you want to use. The Aspell PHP interface is the one used with a *very* old version of Aspell as the manual says.
Sorry if this is confusing, but it is not really my fought as I have no control over PHP development. Eventually a new Aspell interface should be provided for PHP which uses the new Aspell interface provided with Aspell 0.50 but for now the Pspell interface will work just fine.
Note: If you wish to use an older version of Aspell (_before_ 0.50) than both Aspell and Pspell are required.
csnyder at chxo dot com
11-Oct-2002 04:37
11-Oct-2002 04:37
As an alternative to mucking about with the compiled-in aspell/pspell functions, which only check word by word, one could write a script that calls aspell as a shell exec to check a whole block of text:
http://chxo.com/scripts/spellcheck.php
(there is a view-source option)
Not sure about Linux or Windows, but installing aspell on FreeBSD was trivially easy from the ports collection. No doubt such a script could be easily modified to use ispell instead if you'd rather.