CXVIII. Pspell Functions

简介

These functions allow you to check the spelling of a word and offer suggestions.

需求

To compile PHP with pspell support, you need the aspell library, available from http://aspell.sourceforge.net/.

安装

If you have the libraries needed add the --with-pspell[=dir] option when compiling PHP.

Note to Win32 Users: win32 support is available only in PHP 4.3.3 and later versions. Also, you must have aspell 0.50 or newer installed. In order to enable this module under Windows, you must copy aspell-15.dll from the bin folder of your aspell installation to a folder where PHP will be able to find it. C:\PHP or the SYSTEM32 folder of your windows machine (Ex: C:\WINNT\SYSTEM32 or C:\WINDOWS\SYSTEM32) are good choices.

运行时配置

本扩展模块在 php.ini 中未定义任何配置选项。

资源类型

本扩展模块未定义任何资源类型。

预定义常量

以下常量由本扩展模块定义,因此只有在本扩展模块被编译到 PHP 中,或者在运行时被动态加载后才有效。

PSPELL_FAST (integer)

PSPELL_NORMAL (integer)

PSPELL_BAD_SPELLERS (integer)

PSPELL_RUN_TOGETHER (integer)

目录
pspell_add_to_personal -- Add the word to a personal wordlist
pspell_add_to_session -- Add the word to the wordlist in the current session
pspell_check -- Check a word
pspell_clear_session -- Clear the current session
pspell_config_create -- Create a config used to open a dictionary
pspell_config_data_dir --  location of language data files
pspell_config_dict_dir --  Location of the main word list
pspell_config_ignore -- Ignore words less than N characters long
pspell_config_mode -- Change the mode number of suggestions returned
pspell_config_personal -- Set a file that contains personal wordlist
pspell_config_repl -- Set a file that contains replacement pairs
pspell_config_runtogether -- Consider run-together words as valid compounds
pspell_config_save_repl -- Determine whether to save a replacement pairs list along with the wordlist
pspell_new_config -- Load a new dictionary with settings based on a given config
pspell_new_personal -- Load a new dictionary with personal wordlist
pspell_new -- Load a new dictionary
pspell_save_wordlist -- Save the personal wordlist to a file
pspell_store_replacement -- Store a replacement pair for a word
pspell_suggest -- Suggest spellings of a word

add a note add a note User Contributed Notes
sholland at napervillegi dot com
29-Oct-2006 02: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 06: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 04: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 05: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 07: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 06: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 06: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 05: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 01: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 10: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 03: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 06: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 03: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.