За последние 24 часа нас посетили 22854 программиста и 1262 робота. Сейчас ищут 784 программиста ...

Транслит текста, не совсем удачный скрипт

Тема в разделе "Решения, алгоритмы", создана пользователем kir55rus, 31 мар 2011.

  1. kir55rus

    kir55rus Активный пользователь

    С нами с:
    11 дек 2009
    Сообщения:
    20
    Симпатии:
    0
    Всем привет, решил выложить.. вдруг кому понадобится.

    Код (Text):
    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    2. <html xmlns="http://www.w3.org/1999/xhtml">
    3. <head>
    4. <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
    5. <title>Документ без названия</title>
    6. </head>
    7. <body>
    8. <?
    9. if(isset($_GET['text']) && $_GET['text']!=''){
    10. setlocale(LC_CTYPE,'ru_RU.CP1251');
    11. $oldText=$_GET['text'];$oldText=trim($oldText);$oldText=strtolower($oldText);
    12. $ruMass = array('а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я','"','\'','?','/','.',',','!','@','#','$','%','^','&','*','(',')','=','+','<','>','|','\\',';',':','№',' ');
    13. $enMass = array('a','b','v','g','d','e','yo','zh','zz','i','j','k','l','m','n','o','p','r','s','t','u','f','x','c','ch','sh','shh','','y','','ye','yu','ya',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','-');
    14. for($i=0;$i<count($ruMass);$i++){$oldText=str_replace($ruMass[$i],$enMass[$i],$oldText);}
    15. $errorMass=array('-----------','----------','---------','--------','-------','------','-----','----','---','--');
    16. for($j=0;$j<count($errorMass);$j++){$oldText=str_replace($errorMass[$j],'-',$oldText);  }
    17. if(substr($oldText,strlen($oldText)-1,1)=='-'){$oldText=substr($oldText,0,(strlen($oldText))-1);}
    18. echo $oldText;}
    19. ?>
    20.  
    21.  
    22. <form action="index.php" method="get">
    23. <input type="text" size="100" maxlength="300" name="text" />
    24. <input type="submit" value="Ok" />
    25. </form>
    26. </body>
    27. </html>
    Вот пример работы скрипта:
    http://translit.мир-поздравлений.рф/


    скрипт сыроват.. но если надо срочно перевести в транслит. или лень писать самому - то подойдет.
     
  2. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    kir55rus
    strtr отменили?
     
  3. kir55rus

    kir55rus Активный пользователь

    С нами с:
    11 дек 2009
    Сообщения:
    20
    Симпатии:
    0
    Apple
    у меня с strtr некорректно работал скрипт. вот код:

    PHP:
    1. if(isset($_GET['text']) && $_GET['text']!=''){
    2. setlocale(LC_CTYPE,'ru_RU.CP1251');
    3. $oldText=$_GET['text'];$oldText=trim($oldText);$oldText=strtolower($oldText);
    4. $trans = array("а"=>"a","б"=>"b","в"=>"v","г"=>"g","д"=>"d","е"=>"e","ё"=>"yo","ж"=>"zh","з"=>"zz","и"=>"i","й"=>"j","к"=>"k","л"=>"l","м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r","с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"x","ц"=>"c","ч"=>"ch","ш"=>"sh","щ"=>"shh","ъ"=>"","ы"=>"y","ь"=>"","э"=>"ye","ю"=>"yu","я"=>"ya","\""=>" ","'"=>" ","?"=>" ","/"=>" ","."=>" ",","=>" ","!"=>" ","@"=>" ","#"=>" ","$"=>" ","%"=>" ","^"=>" ","&"=>" ","*"=>" ","("=>" ",")"=>" ","="=>" ","+"=>" ","<"=>" ",">"=>" ","|"=>" ","\\"=>" ",";"=>" ",":"=>" ","№"=>" "," "=>"-","----------"=>"-","---------"=>"-","--------"=>"-","-------"=>"-","------"=>"-","-----"=>"-","----"=>"-","---"=>"-","--"=>"-");
    5. $oldText=strtr($oldText, $trans);
    6. if(substr($oldText,strlen($oldText)-1,1)=='-'){$oldText=substr($oldText,0,(strlen($oldText))-1);}
    7. echo $oldText;}
    например строку
    Код (Text):
    1. "Проверка      !"
    он переделает в "proverka------". когда первый код даст результат: "proverka"
    возможно где-то сделал ошибку, но я не замечаю
     
  4. Samsonov

    Samsonov Активный пользователь

    С нами с:
    31 мар 2011
    Сообщения:
    12
    Симпатии:
    0
    Адрес:
    DC
    У вас два принципиально разных алгоритма.
    1. Тот, что с strtr, выполняет однократную подмену согласно таблице: пробелы заменяются на дефисы, восклицательный знак (чем он провинился?) заменяется на пробел; так как последним символом в новой строке оказывается пробел, а не дефис, то конечные дефисы не обрезаются.
    2. Алгоритм с str_replace выполняет итеративную замену, применяя последующие правила к результату предшествующих подмен, поэтому сначала восклицательный знак заменяется на пробел, а потом вся эта серия получившихся пробелов заменяется на дефисы (7 шт.), которые затем превращаются в 1 дефис, который в конце концов отрезается как оконечный.
    То есть никакой «ошибки» нет — работает так, как задумано; вопрос только в том, что за странное преобразование вы задумали.


    Чем занимается этот кусок кода? Сначала он преобразует последовательности дефисов в одиночные символы, да так, что одни и те же исходные последовательности раз за разом будут подвергаться новым преобразованиям. И всё только ради того, чтобы в конце концов оставшийся одиночный дефис отрезать, если он последний. Тихий ужас.

    Всё то же самое можно проделать в одно действие с помощью регулярных выражений:
    Код (Text):
    1. $oldText = preg_replace(array('/-{2,}/', '/-$/'), array('-', ''), $oldText);

    Зачем вычислять длину массива при каждой итерации? Она, что, меняется?


    NB. Ставьте пробелы в коде хотя бы изредка, чтобы длинные строки могли переноситься.
     
  5. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Насколько я помню, это актуально было максимум для ранних четвертых версий РНР.
    Длинна массива в условии цикла for вычисляется один и только один раз. На этом форуме несколько лет назад велось уже обсуждение на эту тему.
     
  6. Samsonov

    Samsonov Активный пользователь

    С нами с:
    31 мар 2011
    Сообщения:
    12
    Симпатии:
    0
    Адрес:
    DC
    Даже если это так (по-моему, несколько неожиданный* подход), то в любом случае код своим видом вводит в заблуждение — будто мы допускаем, что массив может меняться внутри цикла.


    * Неожиданный, потому что семантика for() предполагает повторное вычисление всех аргументов. Это же не Бейсик, где границы цикла FOR принято рассчитывать однократно.
     
  7. MaXyC_Web_Studio

    MaXyC_Web_Studio Активный пользователь

    С нами с:
    31 дек 2006
    Сообщения:
    678
    Симпатии:
    3
    Адрес:
    Новоуральск
    PHP:
    1.     function translit($text){
    2.         $rus = array(
    3.             'А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ы','Ь','Э','Ю','Я',
    4.             'а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я',
    5.             '~','!','@','#','%','^','&','*','(',')','_','+','-','=','`',',','.','/','<','>','{','}','[',']',';','\'','\\',':','"','|',
    6.             ' ','№','$','«','»'
    7.         );
    8.         $eng = array(
    9.             'a','b','v','g','d','e','e','zh','z','i','i','k','l','m','n','o','p','r','s','t','u','f','h','c','ch','sh','scsh','_','y','_','_','yu','ya',
    10.             'a','b','v','g','d','e','e','zh','z','i','i','k','l','m','n','o','p','r','s','t','u','f','h','c','ch','sh','scsh','_','y','_','_','yu','ya',
    11.             '','','','','','','','','','','_','','-','','','','.','','','','','','','','','','','','','',
    12.             '-','','','',''
    13.         );
    14.  
    15.         $text = str_replace($rus, $eng, $text);
    16.  
    17.  
    18.         $text = preg_replace('#(\W)+#','_', $text);
    19.  
    20.         return $text;
    21.     }
     
  8. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    а вот сам транслит имеет несколько разновидностей, и какую лучше брать?

    Код (Text):
    1. http://lurkmore.ru/Транслит#.D0.A2.D0.B8.D0.BF.D1.8B_.D1.82.D1.80.D0.B0.D0.BD.D1.81.D0.BB.D0.B8.D1.82.D0.B0
     
  9. turrel

    turrel Активный пользователь

    С нами с:
    12 июн 2011
    Сообщения:
    65
    Симпатии:
    0
    На днях тоже писал скрипт транслиттерации (рус->англ). Так вот некоторым сочетаниям русских букв соответствуют определенные сочетания английских, т.е. что-то вроде исключений.
    В этом скрипте это вроде не учтено. То же самое есть и при обратном переводе.

    http://yandex.ru/yandsearch?text=%D0%BF ... 510&lr=213