I18N_Arabic
[ class tree: I18N_Arabic ] [ index: I18N_Arabic ] [ all elements ]

Source for file Normalise.php

Documentation is available at Normalise.php

  1. <?php
  2. /**
  3.  * ----------------------------------------------------------------------
  4.  *  
  5.  * Copyright (c) 2006-2016 Khaled Al-Sham'aa.
  6.  *  
  7.  * http://www.ar-php.org
  8.  *  
  9.  * PHP Version 5
  10.  *  
  11.  * ----------------------------------------------------------------------
  12.  *  
  13.  * LICENSE
  14.  *
  15.  * This program is open source product; you can redistribute it and/or
  16.  * modify it under the terms of the GNU Lesser General Public License (LGPL)
  17.  * as published by the Free Software Foundation; either version 3
  18.  * of the License, or (at your option) any later version.
  19.  * 
  20.  * This program is distributed in the hope that it will be useful,
  21.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  22.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  23.  * GNU Lesser General Public License for more details.
  24.  *  
  25.  * You should have received a copy of the GNU Lesser General Public License
  26.  * along with this program.  If not, see <http://www.gnu.org/licenses/lgpl.txt>.
  27.  *  
  28.  * ----------------------------------------------------------------------
  29.  *  
  30.  * Class Name: Functions to normalise Arabic text.
  31.  *  
  32.  * Filename:   Normalise.php
  33.  *  
  34.  * Original    Author(s): Khaled Al-Sham'aa <khaled@ar-php.org>
  35.  *  
  36.  * Purpose:   Text normalisation through various stages. Also: unshaping.
  37.  *  
  38.  * ----------------------------------------------------------------------
  39.  *  
  40.  *  This class provides various functions to manipulate arabic text and
  41.  *  normalise it by applying filters, for example, to strip tatweel and
  42.  *  tashkeel, to normalise hamza and lamalephs, and to unshape
  43.  *  a joined Arabic text back into its normalised form.
  44.  *
  45.  *  There is also a function to reverse a utf8 string.
  46.  *
  47.  *  The functions are helpful for searching, indexing and similar
  48.  *  functions.
  49.  *
  50.  * Note that this class can only deal with UTF8 strings. You can use functions
  51.  * from the other classes to convert between encodings if necessary.
  52.  *
  53.  * Example:
  54.  * <code>
  55.  *     include('./I18N/Arabic.php');
  56.  *     $obj = new I18N_Arabic('Normalise');
  57.  * 
  58.  *     $str = "Arabic text with tatweel, tashkeel...";
  59.  * 
  60.  *     echo "<p><u><i>Before:</i></u><br />$str<br /><br />";
  61.  *     
  62.  *     $text = $obj->stripTatweel($str);
  63.  *        
  64.  *     echo "<u><i>After:</i></u><br />$text<br /><br />";
  65.  * </code>
  66.  *
  67.  * @category  I18N
  68.  * @package   I18N_Arabic
  69.  * @author    Djihed Afifi <djihed@gmail.com>
  70.  * @copyright 2006-2016 Khaled Al-Sham'aa
  71.  *    
  72.  * @license   LGPL <http://www.gnu.org/licenses/lgpl.txt>
  73.  * @link      http://www.ar-php.org
  74.  */
  75.  
  76. /**
  77.  *  This class provides various functions to manipulate arabic text and
  78.  *  normalise it by applying filters, for example, to strip tatweel and
  79.  *  tashkeel, to normalise hamza and lamalephs, and to unshape
  80.  *  a joined Arabic text back into its normalised form.
  81.  *
  82.  *  The functions are helpful for searching, indexing and similar
  83.  *  functions.
  84.  *  
  85.  * @category  I18N
  86.  * @package   I18N_Arabic
  87.  * @author    Djihed Afifi <djihed@gmail.com>
  88.  * @copyright 2006-2016 Khaled Al-Sham'aa
  89.  *    
  90.  * @license   LGPL <http://www.gnu.org/licenses/lgpl.txt>
  91.  * @link      http://www.ar-php.org
  92.  */ 
  93. {
  94.     private $_unshapeMap    array();
  95.     private $_unshapeKeys   array();
  96.     private $_unshapeValues array();
  97.     private $_chars         array();
  98.     private $_charGroups    array();
  99.     private $_charArNames   array();
  100.  
  101.      /**
  102.       * Load the Unicode constants that will be used ibn substitutions
  103.       * and normalisations.
  104.       *
  105.       * @ignore
  106.       */
  107.     public function __construct(
  108.     {
  109.         include dirname(__FILE__'/data/charset/ArUnicode.constants.php';
  110.  
  111.         $this->_unshapeMap    $ligature_map;
  112.         $this->_unshapeKeys   array_keys($this->_unshapeMap);
  113.         $this->_unshapeValues array_values($this->_unshapeMap);
  114.         $this->_chars         $char_names;
  115.         $this->_charGroups    $char_groups;
  116.         $this->_charArNames   $char_ar_names;
  117.     }    
  118.  
  119.     /**
  120.      * Strip all tatweel characters from an Arabic text.
  121.      * 
  122.      * @param string $text The text to be stripped.
  123.      *      
  124.      * @return string the stripped text.
  125.      * @author Djihed Afifi <djihed@gmail.com>
  126.      */ 
  127.     public function stripTatweel($text
  128.     {
  129.         return str_replace($this->_chars['TATWEEL']''$text)
  130.     }
  131.  
  132.     /**
  133.      * Strip all tashkeel characters from an Arabic text.
  134.      * 
  135.      * @param string $text The text to be stripped.
  136.      *      
  137.      * @return string the stripped text.
  138.      * @author Djihed Afifi <djihed@gmail.com>
  139.      */ 
  140.     public function stripTashkeel($text
  141.     {
  142.         $tashkeel array(
  143.              $this->_chars['FATHATAN']
  144.              $this->_chars['DAMMATAN']
  145.              $this->_chars['KASRATAN']
  146.              $this->_chars['FATHA']
  147.              $this->_chars['DAMMA']
  148.              $this->_chars['KASRA'],
  149.              $this->_chars['SUKUN'],
  150.              $this->_chars['SHADDA']
  151.         );
  152.         return str_replace($tashkeel""$text);
  153.     }
  154.  
  155.     /**
  156.      * Normalise all Hamza characters to their corresponding aleph
  157.      * character in an Arabic text.
  158.      *
  159.      * @param string $text The text to be normalised.
  160.      *      
  161.      * @return string the normalised text.
  162.      * @author Djihed Afifi <djihed@gmail.com>
  163.      */ 
  164.     public function normaliseHamza($text
  165.     {
  166.         $replace array(
  167.              $this->_chars['WAW_HAMZA'$this->_chars['WAW'],
  168.              $this->_chars['YEH_HAMZA'$this->_chars['YEH'],
  169.         );
  170.         $alephs array(
  171.              $this->_chars['ALEF_MADDA'],
  172.              $this->_chars['ALEF_HAMZA_ABOVE'],
  173.              $this->_chars['ALEF_HAMZA_BELOW'],
  174.              $this->_chars['HAMZA_ABOVE,HAMZA_BELOW']
  175.         );
  176.  
  177.         $text str_replace(array_keys($replace)array_values($replace)$text);
  178.         $text str_replace($alephs$this->_chars['ALEF']$text);
  179.         return $text;
  180.     }
  181.  
  182.     /**
  183.      * Unicode uses some special characters where the lamaleph and any
  184.      * hamza above them are combined into one code point. Some input
  185.      * system use them. This function expands these characters.
  186.      *
  187.      * @param string $text The text to be normalised.
  188.      *      
  189.      * @return string the normalised text.
  190.      * @author Djihed Afifi <djihed@gmail.com>
  191.      */ 
  192.     public function normaliseLamaleph ($text
  193.     {
  194.         $text str_replace(
  195.             $this->_chars['LAM_ALEPH']
  196.             $simple_LAM_ALEPH
  197.             $text
  198.         );
  199.         $text str_replace(
  200.             $this->_chars['LAM_ALEPH_HAMZA_ABOVE']
  201.             $simple_LAM_ALEPH_HAMZA_ABOVE
  202.             $text
  203.         );
  204.         $text str_replace(
  205.             $this->_chars['LAM_ALEPH_HAMZA_BELOW']
  206.             $simple_LAM_ALEPH_HAMZA_BELOW
  207.             $text
  208.         );
  209.         $text str_replace(
  210.             $this->_chars['LAM_ALEPH_MADDA_ABOVE']
  211.             $simple_LAM_ALEPH_MADDA_ABOVE
  212.             $text
  213.         );
  214.         return $text;
  215.     }
  216.  
  217.     /**
  218.      * Return unicode char by its code point.
  219.      *
  220.      * @param char $u code point
  221.      *      
  222.      * @return string the result character.
  223.      * @author Djihed Afifi <djihed@gmail.com>
  224.      */
  225.     public function unichr($u
  226.     {
  227.         return mb_convert_encoding('&#'.intval($u).';''UTF-8''HTML-ENTITIES');
  228.     }
  229.  
  230.     /**
  231.      * Takes a string, it applies the various filters in this class
  232.      * to return a unicode normalised string suitable for activities
  233.      * such as searching, indexing, etc.
  234.      *
  235.      * @param string $text the text to be normalised.
  236.      *      
  237.      * @return string the result normalised string.
  238.      * @author Djihed Afifi <djihed@gmail.com>
  239.      */ 
  240.     public function normalise($text)
  241.     {
  242.         $text $this->stripTashkeel($text);
  243.         $text $this->stripTatweel($text);
  244.         $text $this->normaliseHamza($text);
  245.         $text $this->normaliseLamaleph($text);
  246.  
  247.         return $text;
  248.     
  249.  
  250.     /**
  251.      * Takes Arabic text in its joined form, it untangles the characters
  252.      * and  unshapes them.
  253.      *
  254.      * This can be used to process text that was processed through OCR
  255.      * or by extracting text from a PDF document.
  256.      *
  257.      * Note that the result text may need further processing. In most
  258.      * cases, you will want to use the utf8Strrev function from
  259.      * this class to reverse the string.
  260.      *  
  261.      * Most of the work of setting up the characters for this function
  262.      * is done through the ArUnicode.constants.php constants and
  263.      * the constructor loading.
  264.      *
  265.      * @param string $text the text to be unshaped.
  266.      *      
  267.      * @return string the result normalised string.
  268.      * @author Djihed Afifi <djihed@gmail.com>
  269.      */
  270.     public function unshape($text)
  271.     {
  272.           return str_replace($this->_unshapeKeys$this->_unshapeValues$text);
  273.     }
  274.  
  275.     /**
  276.      * Take a UTF8 string and reverse it.
  277.      *
  278.      * @param string  $str             the string to be reversed.
  279.      * @param boolean $reverse_numbers whether to reverse numbers.
  280.      *      
  281.      * @return string The reversed string.
  282.      */
  283.     public function utf8Strrev($str$reverse_numbers false
  284.     {
  285.         preg_match_all('/./us'$str$ar);
  286.         if ($reverse_numbers{
  287.             return join(''array_reverse($ar[0]));
  288.         else {
  289.             $temp array();
  290.             foreach ($ar[0as $value{
  291.                 if (is_numeric($value&& !empty($temp[0]&& is_numeric($temp[0])) {
  292.                     foreach ($temp as $key => $value2{
  293.                         if (is_numeric($value2)) {
  294.                             $pos ($key 1);
  295.                         else {
  296.                             break;
  297.                         }
  298.                     }
  299.                     $temp2 array_splice($temp$pos);
  300.                     $temp  array_merge($temparray($value)$temp2);
  301.                 else {
  302.                     array_unshift($temp$value);
  303.                 }
  304.             }
  305.             return implode(''$temp);
  306.         }
  307.     }
  308.     
  309.     /**
  310.      * Checks for Arabic Tashkeel marks (i.e. FATHA, DAMMA, KASRA, SUKUN,
  311.      * SHADDA, FATHATAN, DAMMATAN, KASRATAN).
  312.      *
  313.      * @param string $archar Arabic unicode char
  314.      *      
  315.      * @return boolean True if it is Arabic Tashkeel mark
  316.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  317.      */
  318.     public function isTashkeel($archar)
  319.     {
  320.         $key array_search($archar$this->_chars);
  321.  
  322.         if (in_array($key$this->_charGroups['TASHKEEL'])) {
  323.             $value true;
  324.         else {
  325.             $value false;
  326.         }
  327.         
  328.         return $value;
  329.     }
  330.     
  331.     /**
  332.      * Checks for Arabic Harakat marks (i.e. FATHA, DAMMA, KASRA, SUKUN, TANWIN).
  333.      *
  334.      * @param string $archar Arabic unicode char
  335.      *      
  336.      * @return boolean True if it is Arabic Harakat mark
  337.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  338.      */
  339.     public function isHaraka($archar)
  340.     {
  341.         $key array_search($archar$this->_chars);
  342.  
  343.         if (in_array($key$this->_charGroups['HARAKAT'])) {
  344.             $value true;
  345.         else {
  346.             $value false;
  347.         }
  348.         
  349.         return $value;
  350.     }
  351.     
  352.     /**
  353.      * Checks for Arabic short Harakat marks (i.e. FATHA, DAMMA, KASRA, SUKUN).
  354.      *
  355.      * @param string $archar Arabic unicode char
  356.      *      
  357.      * @return boolean True if it is Arabic short Harakat mark
  358.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  359.      */
  360.     public function isShortharaka($archar)
  361.     {
  362.         $key array_search($archar$this->_chars);
  363.  
  364.         if (in_array($key$this->_charGroups['SHORTHARAKAT'])) {
  365.             $value true;
  366.         else {
  367.             $value false;
  368.         }
  369.         
  370.         return $value;
  371.     }
  372.     
  373.     /**
  374.      * Checks for Arabic Tanwin marks (i.e. FATHATAN, DAMMATAN, KASRATAN).
  375.      *
  376.      * @param string $archar Arabic unicode char
  377.      *      
  378.      * @return boolean True if it is Arabic Tanwin mark
  379.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  380.      */
  381.     public function isTanwin($archar)
  382.     {
  383.         $key array_search($archar$this->_chars);
  384.  
  385.         if (in_array($key$this->_charGroups['TANWIN'])) {
  386.             $value true;
  387.         else {
  388.             $value false;
  389.         }
  390.         
  391.         return $value;
  392.     }
  393.     
  394.     /**
  395.      * Checks for Arabic Ligatures like LamAlef (i.e. LAM ALEF, LAM ALEF HAMZA
  396.      * ABOVE, LAM ALEF HAMZA BELOW, LAM ALEF MADDA ABOVE).
  397.      *
  398.      * @param string $archar Arabic unicode char
  399.      *      
  400.      * @return boolean True if it is Arabic Ligatures like LamAlef
  401.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  402.      */
  403.     public function isLigature($archar)
  404.     {
  405.         $key array_search($archar$this->_chars);
  406.  
  407.         if (in_array($key$this->_charGroups['LIGUATURES'])) {
  408.             $value true;
  409.         else {
  410.             $value false;
  411.         }
  412.         
  413.         return $value;
  414.     }
  415.     
  416.     /**
  417.      * Checks for Arabic Hamza forms (i.e. HAMZA, WAW HAMZA, YEH HAMZA, HAMZA ABOVE,
  418.      * HAMZA BELOW, ALEF HAMZA BELOW, ALEF HAMZA ABOVE).
  419.      *
  420.      * @param string $archar Arabic unicode char
  421.      *      
  422.      * @return boolean True if it is Arabic Hamza form
  423.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  424.      */
  425.     public function isHamza($archar)
  426.     {
  427.         $key array_search($archar$this->_chars);
  428.  
  429.         if (in_array($key$this->_charGroups['HAMZAT'])) {
  430.             $value true;
  431.         else {
  432.             $value false;
  433.         }
  434.         
  435.         return $value;
  436.     }
  437.     
  438.     /**
  439.      * Checks for Arabic Alef forms (i.e. ALEF, ALEF MADDA, ALEF HAMZA ABOVE,
  440.      * ALEF HAMZA BELOW,ALEF WASLA, ALEF MAKSURA).
  441.      *
  442.      * @param string $archar Arabic unicode char
  443.      *      
  444.      * @return boolean True if it is Arabic Alef form
  445.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  446.      */
  447.     public function isAlef($archar)
  448.     {
  449.         $key array_search($archar$this->_chars);
  450.  
  451.         if (in_array($key$this->_charGroups['ALEFAT'])) {
  452.             $value true;
  453.         else {
  454.             $value false;
  455.         }
  456.         
  457.         return $value;
  458.     }
  459.     
  460.     /**
  461.      * Checks for Arabic Weak letters (i.e. ALEF, WAW, YEH, ALEF_MAKSURA).
  462.      *
  463.      * @param string $archar Arabic unicode char
  464.      *      
  465.      * @return boolean True if it is Arabic Weak letter
  466.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  467.      */
  468.     public function isWeak($archar)
  469.     {
  470.         $key array_search($archar$this->_chars);
  471.  
  472.         if (in_array($key$this->_charGroups['WEAK'])) {
  473.             $value true;
  474.         else {
  475.             $value false;
  476.         }
  477.         
  478.         return $value;
  479.     }
  480.     
  481.     /**
  482.      * Checks for Arabic Yeh forms (i.e. YEH, YEH HAMZA, SMALL YEH, ALEF MAKSURA).
  483.      *
  484.      * @param string $archar Arabic unicode char
  485.      *      
  486.      * @return boolean True if it is Arabic Yeh form
  487.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  488.      */
  489.     public function isYehlike($archar)
  490.     {
  491.         $key array_search($archar$this->_chars);
  492.  
  493.         if (in_array($key$this->_charGroups['YEHLIKE'])) {
  494.             $value true;
  495.         else {
  496.             $value false;
  497.         }
  498.         
  499.         return $value;
  500.     }
  501.     
  502.     /**
  503.      * Checks for Arabic Waw like forms (i.e. WAW, WAW HAMZA, SMALL WAW).
  504.      *
  505.      * @param string $archar Arabic unicode char
  506.      *      
  507.      * @return boolean True if it is Arabic Waw like form
  508.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  509.      */
  510.     public function isWawlike($archar)
  511.     {
  512.         $key array_search($archar$this->_chars);
  513.  
  514.         if (in_array($key$this->_charGroups['WAWLIKE'])) {
  515.             $value true;
  516.         else {
  517.             $value false;
  518.         }
  519.         
  520.         return $value;
  521.     }
  522.     
  523.     /**
  524.      * Checks for Arabic Teh forms (i.e. TEH, TEH MARBUTA).
  525.      *
  526.      * @param string $archar Arabic unicode char
  527.      *      
  528.      * @return boolean True if it is Arabic Teh form
  529.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  530.      */
  531.     public function isTehlike($archar)
  532.     {
  533.         $key array_search($archar$this->_chars);
  534.  
  535.         if (in_array($key$this->_charGroups['TEHLIKE'])) {
  536.             $value true;
  537.         else {
  538.             $value false;
  539.         }
  540.         
  541.         return $value;
  542.     }
  543.     
  544.     /**
  545.      * Checks for Arabic Small letters (i.e. SMALL ALEF, SMALL WAW, SMALL YEH).
  546.      *
  547.      * @param string $archar Arabic unicode char
  548.      *      
  549.      * @return boolean True if it is Arabic Small letter
  550.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  551.      */
  552.     public function isSmall($archar)
  553.     {
  554.         $key array_search($archar$this->_chars);
  555.  
  556.         if (in_array($key$this->_charGroups['SMALL'])) {
  557.             $value true;
  558.         else {
  559.             $value false;
  560.         }
  561.         
  562.         return $value;
  563.     }
  564.     
  565.     /**
  566.      * Checks for Arabic Moon letters.
  567.      *
  568.      * @param string $archar Arabic unicode char
  569.      *      
  570.      * @return boolean True if it is Arabic Moon letter
  571.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  572.      */
  573.     public function isMoon($archar)
  574.     {
  575.         $key array_search($archar$this->_chars);
  576.  
  577.         if (in_array($key$this->_charGroups['MOON'])) {
  578.             $value true;
  579.         else {
  580.             $value false;
  581.         }
  582.         
  583.         return $value;
  584.     }
  585.     
  586.     /**
  587.      * Checks for Arabic Sun letters.
  588.      *
  589.      * @param string $archar Arabic unicode char
  590.      *      
  591.      * @return boolean True if it is Arabic Sun letter
  592.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  593.      */
  594.     public function isSun($archar)
  595.     {
  596.         $key array_search($archar$this->_chars);
  597.  
  598.         if (in_array($key$this->_charGroups['SUN'])) {
  599.             $value true;
  600.         else {
  601.             $value false;
  602.         }
  603.         
  604.         return $value;
  605.     }
  606.     
  607.     /**
  608.      * Return Arabic letter name in arabic.
  609.      *
  610.      * @param string $archar Arabic unicode char
  611.      *      
  612.      * @return string Arabic letter name in arabic
  613.      * @author Khaled Al-Sham'aa <khaled@ar-php.org>
  614.      */
  615.     public function charName($archar)
  616.     {
  617.         $key array_search($archar$this->_chars);
  618.  
  619.         $name $this->_charArNames["$key"];
  620.         
  621.         return $name;
  622.     }
  623. }

Documentation generated on Fri, 01 Jan 2016 10:26:11 +0200 by phpDocumentor 1.4.0