/** * Главный метод * * @param scalar|null $s Текст в кодировке UTF-8. * @param array|null $words Ассоц. массив со словами, которые были исправлены: * в ключах оригиналы, в значениях исправленные слова. * @return string|bool returns FALSE if error occured */ public function parse($s, array &$words = null) { if (!ReflectionTypeHint::isValid()) { return false; } if (!is_string($s)) { return $s; } #пропускаем текст, в котором нет букв [ЕеЁё] if ($this->_is_skip($s)) { return $s; } #speed improve if (!(is_array($this->dic) || is_resource($this->db))) { if (function_exists('dba_open') && array_key_exists('cdb', dba_handlers(true))) { $this->db = dba_open($this->_filename('cdb'), 'r', 'cdb'); if ($this->db === false) { return $s; } } elseif ($this->is_work_for_cdb_only) { return $s; } else { include $this->_filename('php'); } } #вырезаем и заменяем некоторые символы $additional_chars = array(""); $s = UTF8::diactrical_remove($s, $additional_chars, $is_can_restored = true, $restore_table); $this->words = array(); #заменяем слова из текста, минимальная длина слова -- 3 буквы, меньше нельзя $s = preg_replace_callback('/ (' . $this->ru . ') #1 первая буква ((?:' . $this->ru_lc . '){2,}+) #2 остальные буквы (?! \\.(?>[\\x00-\\x20]+|\\xc2\\xa0)+ #\\xc2\\xa0 = (?> (?:' . $this->ru_lc . ') | (?:' . $this->ru_uc . '){2} #пример: долл. США | [\\x21-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7e] ) | \\.[\\x21-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7e] ) /sxSX', array(&$this, '_word'), $s); $s = UTF8::diactrical_restore($s, $restore_table); $words = $this->words; return $s; }
/** * Исправляет клавиатурные опечатки в тексте. * * @param scalar|null $s Текст в кодировке UTF-8. * @param int $mode Константы self::SIMILAR_CHARS и/или self::KEYBOARD_LAYOUT, * (их можно комбинировать). Описание констант см. выше. * При использовании self::KEYBOARD_LAYOUT время работы увеличивается примерно в 10 раз. * @param array &$words Ассоц. массив со словами, которые были исправлены: * в ключах оригиналы, в значениях исправленные слова. * @return string|bool Returns FALSE if error occured */ public function parse($s, $mode = self::SIMILAR_CHARS, array &$words = null) { if (!ReflectionTypeHint::isValid()) { return false; } if (!is_string($s)) { return $s; } if ($mode < self::SIMILAR_CHARS || $mode > (self::SIMILAR_CHARS | self::KEYBOARD_LAYOUT | self::ADD_FIX)) { trigger_error('Unknown mode', E_USER_WARNING); return false; } $this->mode = $mode; #вырезаем и заменяем некоторые символы $additional_chars = array(""); #http://ru.wikipedia.org/wiki/Диакритические_знаки $s = UTF8::diactrical_remove($s, $additional_chars, $is_can_restored = true, $restore_table); $this->words = array(); $s = $this->_parse1($s); $s = $this->_parse2($s); $s = UTF8::diactrical_restore($s, $restore_table); $words = $this->words; return $s; }