Всем привет, решил выложить.. вдруг кому понадобится. Код (Text): <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> <title>Документ без названия</title> </head> <body> <? if(isset($_GET['text']) && $_GET['text']!=''){ setlocale(LC_CTYPE,'ru_RU.CP1251'); $oldText=$_GET['text'];$oldText=trim($oldText);$oldText=strtolower($oldText); $ruMass = array('а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я','"','\'','?','/','.',',','!','@','#','$','%','^','&','*','(',')','=','+','<','>','|','\\',';',':','№',' '); $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',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','-'); for($i=0;$i<count($ruMass);$i++){$oldText=str_replace($ruMass[$i],$enMass[$i],$oldText);} $errorMass=array('-----------','----------','---------','--------','-------','------','-----','----','---','--'); for($j=0;$j<count($errorMass);$j++){$oldText=str_replace($errorMass[$j],'-',$oldText); } if(substr($oldText,strlen($oldText)-1,1)=='-'){$oldText=substr($oldText,0,(strlen($oldText))-1);} echo $oldText;} ?> <form action="index.php" method="get"> <input type="text" size="100" maxlength="300" name="text" /> <input type="submit" value="Ok" /> </form> </body> </html> Вот пример работы скрипта: http://translit.мир-поздравлений.рф/ скрипт сыроват.. но если надо срочно перевести в транслит. или лень писать самому - то подойдет.
Apple у меня с strtr некорректно работал скрипт. вот код: PHP: if(isset($_GET['text']) && $_GET['text']!=''){ setlocale(LC_CTYPE,'ru_RU.CP1251'); $oldText=$_GET['text'];$oldText=trim($oldText);$oldText=strtolower($oldText); $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","\""=>" ","'"=>" ","?"=>" ","/"=>" ","."=>" ",","=>" ","!"=>" ","@"=>" ","#"=>" ","$"=>" ","%"=>" ","^"=>" ","&"=>" ","*"=>" ","("=>" ",")"=>" ","="=>" ","+"=>" ","<"=>" ",">"=>" ","|"=>" ","\\"=>" ",";"=>" ",":"=>" ","№"=>" "," "=>"-","----------"=>"-","---------"=>"-","--------"=>"-","-------"=>"-","------"=>"-","-----"=>"-","----"=>"-","---"=>"-","--"=>"-"); $oldText=strtr($oldText, $trans); if(substr($oldText,strlen($oldText)-1,1)=='-'){$oldText=substr($oldText,0,(strlen($oldText))-1);} echo $oldText;} например строку Код (Text): "Проверка !" он переделает в "proverka------". когда первый код даст результат: "proverka" возможно где-то сделал ошибку, но я не замечаю
У вас два принципиально разных алгоритма. Тот, что с strtr, выполняет однократную подмену согласно таблице: пробелы заменяются на дефисы, восклицательный знак (чем он провинился?) заменяется на пробел; так как последним символом в новой строке оказывается пробел, а не дефис, то конечные дефисы не обрезаются. Алгоритм с str_replace выполняет итеративную замену, применяя последующие правила к результату предшествующих подмен, поэтому сначала восклицательный знак заменяется на пробел, а потом вся эта серия получившихся пробелов заменяется на дефисы (7 шт.), которые затем превращаются в 1 дефис, который в конце концов отрезается как оконечный. То есть никакой «ошибки» нет — работает так, как задумано; вопрос только в том, что за странное преобразование вы задумали. Чем занимается этот кусок кода? Сначала он преобразует последовательности дефисов в одиночные символы, да так, что одни и те же исходные последовательности раз за разом будут подвергаться новым преобразованиям. И всё только ради того, чтобы в конце концов оставшийся одиночный дефис отрезать, если он последний. Тихий ужас. Всё то же самое можно проделать в одно действие с помощью регулярных выражений: Код (Text): $oldText = preg_replace(array('/-{2,}/', '/-$/'), array('-', ''), $oldText); Зачем вычислять длину массива при каждой итерации? Она, что, меняется? NB. Ставьте пробелы в коде хотя бы изредка, чтобы длинные строки могли переноситься.
Насколько я помню, это актуально было максимум для ранних четвертых версий РНР. Длинна массива в условии цикла for вычисляется один и только один раз. На этом форуме несколько лет назад велось уже обсуждение на эту тему.
Даже если это так (по-моему, несколько неожиданный* подход), то в любом случае код своим видом вводит в заблуждение — будто мы допускаем, что массив может меняться внутри цикла. * Неожиданный, потому что семантика for() предполагает повторное вычисление всех аргументов. Это же не Бейсик, где границы цикла FOR принято рассчитывать однократно.
PHP: function translit($text){ $rus = array( 'А','Б','В','Г','Д','Е','Ё','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ы','Ь','Э','Ю','Я', 'а','б','в','г','д','е','ё','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я', '~','!','@','#','%','^','&','*','(',')','_','+','-','=','`',',','.','/','<','>','{','}','[',']',';','\'','\\',':','"','|', ' ','№','$','«','»' ); $eng = array( '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', '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', '','','','','','','','','','','_','','-','','','','.','','','','','','','','','','','','','', '-','','','','' ); $text = str_replace($rus, $eng, $text); $text = preg_replace('#(\W)+#','_', $text); return $text; }
а вот сам транслит имеет несколько разновидностей, и какую лучше брать? Код (Text): 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
На днях тоже писал скрипт транслиттерации (рус->англ). Так вот некоторым сочетаниям русских букв соответствуют определенные сочетания английских, т.е. что-то вроде исключений. В этом скрипте это вроде не учтено. То же самое есть и при обратном переводе. http://yandex.ru/yandsearch?text=%D0%BF ... 510&lr=213