Guest User

Untitled

a guest
Feb 7th, 2011
761
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 9.10 KB | None | 0 0
  1. <?php
  2. /*
  3.   Транслитерация ссылок (приведение их в соответствие с форматом URL).
  4.   Латинские буквы и цифры остаются, а русские + знаки препинания преобразуются
  5.   одним из способов (способы нужны каждый для своей задачи)
  6.  
  7.   Подробнее: http://pixel-apes.com/translit
  8.  
  9.   ---------
  10.  
  11.   Методы этого класса можно использовать как статические,
  12.   например, Translit::UrlTranslit("Свежая новость из цирка")
  13.  
  14.   ---------
  15.  
  16.   * UrlTranslit( $string, $allow_slashes = TR_NO_SLASHES )
  17.     -- преобразовать строку в "красивый читаемый URL"
  18.  
  19.   * Supertag( $string, $allow_slashes = TR_NO_SLASHES )
  20.     -- преобразовать строку в "супертаг" -- короткий простой
  21.        идентификатор, состоящий из латинских букв и цифр.
  22.  
  23.   * BiDiTranslit( $string, $direction=TR_ENCODE, $allow_slashes = TR_NO_SLASHES )
  24.     -- преобразовать строку в "формально правильный URL"
  25.        с возможностью восстановления.
  26.        Другое значение $direction позволяет восстановить
  27.        строку обратно с незначительными потерями
  28.  
  29.   * Wikify( $string, $allow_slashes = TR_NO_SLASHES )
  30.     -- преобразовать произвольную строку в вики-адрес
  31.        например: "Привет мир" => "ПриветМир"
  32.  
  33.   * DeWikify( $string )
  34.     -- попробовать восстановить примерный вид исходной строки по вики-адресу
  35.        например: "ПриветМир" => "Привет Мир"
  36.  
  37.   * во всех функциях параметр $allow_slashes управляет тем, игнорировать ли символ "/",
  38.     пропуская его неисправленным, либо удалять его из строки
  39.  
  40. =============================================================== (Kukutz)
  41.  
  42. */
  43.  
  44. setlocale (LC_ALL, 'ru_RU');
  45.  
  46. setlocale(LC_ALL,'ru_RU.cp1251');
  47.  
  48. define("TR_ENCODE", 0);
  49. define("TR_DECODE", 1);
  50. define("TR_NO_SLASHES", 0);
  51. define("TR_ALLOW_SLASHES", 1);
  52.  
  53. class Base_Translit
  54. {
  55.  
  56.   //пустой конструктор, чтобы методы могли работать через ::
  57.   private function Translit() {}
  58.  
  59.   //URL transliterating
  60.   public static function UrlTranslit($string, $allow_slashes = TR_NO_SLASHES)
  61.   {
  62.    $string = strtolower($string);
  63.  
  64.    $slash = "";
  65.    if ($allow_slashes) $slash = "\/";
  66.  
  67.    static $LettersFrom = "абвгдезиклмнопрстуфыэйхё";
  68.    static $LettersTo   = "abvgdeziklmnoprstufyejxe";
  69.    static $Consonant = "бвгджзйклмнпрстфхцчшщ";
  70.    static $Vowel = "аеёиоуыэюя";
  71.    static $BiLetters = array(
  72.      "ж" => "zh", "ц"=>"ts", "ч" => "ch",
  73.      "ш" => "sh", "щ" => "sch", "ю" => "ju", "я" => "ja",
  74.    );
  75.  
  76.    $string = preg_replace("/[_\s\.,?!\[\](){}]+/", "_", $string);
  77.    $string = preg_replace("/-{2,}/", "--", $string);
  78.    $string = preg_replace("/_-+_/", "--", $string);
  79.    $string = preg_replace("/[_\-]+$/", "", $string);
  80.  
  81.    $string = strtolower( $string );
  82.    //here we replace ъ/ь
  83.    $string = preg_replace("/(ь|ъ)([".$Vowel."])/", "j\\2", $string);
  84.    $string = preg_replace("/(ь|ъ)/", "", $string);
  85.    //transliterating
  86.    $string = strtr($string, $LettersFrom, $LettersTo );
  87.    $string = strtr($string, $BiLetters );
  88.  
  89.    $string = preg_replace("/j{2,}/", "j", $string);
  90.  
  91.    $string = preg_replace("/[^".$slash."0-9a-z_\-]+/", "", $string);
  92.  
  93.    return $string;
  94.   }
  95.  
  96.   //Supertag cooking
  97.   public static function Supertag($string, $allow_slashes = TR_NO_SLASHES)
  98.   {
  99.    $slash = "";
  100.    if ($allow_slashes) $slash = "\/";
  101.  
  102.    $string = Translit::UrlTranslit($string, $allow_slashes);
  103.    $string = preg_replace("/[^".$slash."0-9a-zA-Z\-]+/", "", $string);
  104.    $string = preg_replace("/[\-_]+/", "-", $string);
  105.    $string = preg_replace("/-+$/", "", $string);
  106.    return $string;
  107.   }
  108.  
  109.  
  110.   //Bidirectional translit
  111.   public static function BiDiTranslit($string, $direction=TR_ENCODE, $allow_slashes = TR_NO_SLASHES)
  112.   {
  113.    $slash = "";
  114.    if ($allow_slashes) $slash = "\/";
  115.  
  116.    static $Tran = array (
  117.     "А" => "A",  "Б" => "B",  "В" => "V",  "Г" => "G",  "Д" => "D",  "Е" => "E",  "Ё" => "JO",  "Ж" => "ZH",  "З" => "Z",  "И" => "I",
  118.     "Й" => "JJ", "К" => "K",  "Л" => "L",  "М" => "M",  "Н" => "N",  "О" => "O",  "П" => "P",   "Р" => "R",   "С" => "S",  "Т" => "T",
  119.     "У" => "U",  "Ф" => "F",  "Х" => "KH",  "Ц" => "C",  "Ч" => "CH", "Ш" => "SH", "Щ" => "SHH", "Ъ" => "_~",   "Ы" => "Y",  "Ь" => "_'",
  120.     "Э" => "EH", "Ю" => "JU", "Я" => "JA", "а" => "a",  "б" => "b",  "в" => "v",  "г" => "g",   "д" => "d",   "е" => "e",  "ё" => "jo",
  121.     "ж" => "zh", "з" => "z",  "и" => "i",  "й" => "jj", "к" => "k",  "л" => "l",  "м" => "m",   "н" => "n",   "о" => "o",  "п" => "p",
  122.     "р" => "r",  "с" => "s",  "т" => "t",  "у" => "u",  "ф" => "f",  "х" => "kh",  "ц" => "c",   "ч" => "ch",  "ш" => "sh", "щ" => "shh",
  123.     "ъ" => "~",  "ы" => "y",  "ь" => "'",  "э" => "eh", "ю" => "ju", "я" => "ja", " " => "__", "_" => "__", );
  124.    static $DeTran = array (
  125.     "A"    => "А",   "B"    => "Б",  "V"    => "В",  "G"    => "Г",  "D"    => "Д",  "E"    => "Е",  "JO"   => "Ё",  "ZH"   => "Ж",
  126.     "Z"    => "З",   "I"    => "И",  "JJ"   => "Й",  "K"    => "К",  "L"    => "Л",  "M"    => "М",  "N"    => "Н",  "O"    => "О",
  127.     "P"    => "П",   "R"    => "Р",  "S"    => "С",  "T"    => "Т",  "U"    => "У",  "F"    => "Ф",  "KH"    => "Х",  "C"    => "Ц",
  128.     "CH"   => "Ч",   "SHH"  => "Щ",  "SH"   => "Ш",  "Y"    => "Ы",  "EH"   => "Э",  "JU"   => "Ю",  "_'"=>"Ь", "_~"=>"Ъ",
  129.     "JA"   => "Я",   "a"    => "а",  "b"    => "б",  "v"    => "в",  "g"    => "г",  "d"    => "д",  "e"    => "е",  "jo"   => "ё",
  130.     "zh"   => "ж",   "z"    => "з",  "i"    => "и",  "jj"   => "й",  "k"    => "к",  "l"    => "л",  "m"    => "м",  "n"    => "н",
  131.     "o"    => "о",   "p"    => "п",  "r"    => "р",  "s"    => "с",  "t"    => "т",  "u"    => "у",  "f"    => "ф",  "kh"    => "х",
  132.     "c"    => "ц",   "ch"   => "ч",  "shh"  => "щ",  "sh"   => "ш",  "~"    => "ъ",  "y"    => "ы",  "'"    => "ь",  "eh"   => "э",
  133.     "ju"   => "ю",   "ja"   => "я",  "__" => " ", );
  134.  
  135.    if ($direction==TR_ENCODE)
  136.    {
  137.      $string = preg_replace("/[^\- _0-9a-zA-Z\xC0-\xFFёЁ".$slash."]/", "", $string);
  138.      $russians = preg_split("/[0-9A-Za-z\_\-\.\/\']+/", $string, -1, PREG_SPLIT_NO_EMPTY);//\xc0-\xff
  139.  
  140.      for ($i=0;$i<count($russians);$i++)
  141.        $russians[$i] = strtr($russians[$i], $Tran);
  142.  
  143.      $others = preg_split('/[\xc0-\xff\xa8\xb8 ]+/', $string, -1, PREG_SPLIT_NO_EMPTY);
  144.  
  145.      if (preg_match('/[\xc0-\xff\xa8\xb8 ]/', $string[0]))
  146.      {
  147.        $fr="russians";
  148.        $sr="others";
  149.        $string = "+";
  150.      }
  151.      else
  152.      {
  153.        $fr="others";
  154.        $sr="russians";
  155.        $string = "";
  156.      }
  157.  
  158.      for ($i=0;$i<min(count($$fr),count($$sr));$i++)
  159.       $string.=${$fr}[$i]."+".${$sr}[$i]."+";
  160.  
  161.      if (count($$fr)>count($$sr))
  162.        $string.=${$fr}[count($$fr)-1];
  163.      else
  164.        $string=substr($string,0,strlen($string)-1);
  165.    }
  166.    else
  167.    {
  168.      $pgs = explode("/", $string);
  169.      for ($j=0;$j<count($pgs);$j++)
  170.      {
  171.        $strings = explode("+", $pgs[$j]);
  172.        for ($i=1;$i<count($strings);$i=$i+2)
  173.          $strings[$i] = strtr($strings[$i], $DeTran);
  174.        $pgs[$j] = implode("", $strings);
  175.      }
  176.      $string = implode(($allow_slashes!=TR_NO_SLASHES)?"/":"", $pgs);
  177.    }
  178.    return rtrim($string, "/");
  179.   }
  180.  
  181.  
  182.  
  183.   // Convert string to wiki address
  184.   // "Привет мир" => "ПриветМир"
  185.   public static  function Wikify( $string, $allow_slashes = TR_NO_SLASHES)
  186.   {
  187.     $slash = "";
  188.     if ($allow_slashes) $slash = "\/";
  189.     $string = preg_replace("/[^\- 0-9a-zA-Z\xC0-\xFFёЁ".$slash."]+/", " ", $string);
  190.     // wordglue
  191.     $strings = explode( " ", $string );
  192.     foreach( $strings as $k=>$v )
  193.       $strings[$k] = ucfirst($v);
  194.     $string = implode("",$strings);
  195.     return $string;
  196.   }
  197.  
  198.   // Reconstruct string by given wiki address
  199.   // "ПриветМир" => "Привет Мир"
  200.   // "-"   -- nomatter "Аква-Парк"
  201.   // "0-9" -- nomatter "R 3 Читать", "С 13 Мая" "С Дороги" "СССР Разрушили"
  202.   public static function Dewikify( $string )
  203.   {
  204.     $string = preg_replace( "/([^\-\/])([A-ZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЪЫЭЮЯ]".
  205.                                        "[a-zабвгдеёжзийклмнопрстуфхцчшщьъыэюя0-9])/", "$1 $2", $string );
  206.     $string = preg_replace( "/([^0-9 \-\/])([0-9])/", "$1 $2", $string );
  207.     return $string;
  208.   }
  209.  
  210. }
  211. ?>
Advertisement
Add Comment
Please, Sign In to add comment