Помогите найти ошибку, простейший массив для транслитерации

G6
На сайте с 06.01.2016
Offline
0
456

Помогите найти ошибку, простейший массив для транслитерации, знаю что можно сделать при помощи функции strtr, но в задаче именно этот вариант (я только учусь php)

<?php

function trans($str) {

$output = '';

$trans = array (

"а" => "a", "б" => "b", "в" => "v", "г" => "g", "д" => "d", "е" => "e", "ё" => "yo",

"ж" => "zh", "з" => "z", "и" => "i", "й" => "j", "к" => "k", "л" => "l", "м" => "m",

"н" => "n", "о" => "o", "п" => "p", "р" => "r", "с" => "s", "т" => "t", "у" => "u",

"ф" => "f", "х" => "kh", "ц" => "c", "ч" => "ch", "ш" => "sh", "щ" => "she", "ы" => "y",

"э" => "e", "ю" => "yu", "я" => "ya",

);

//return $str . " => ";

for ($i = 0; $i < strlen($str); $i++) {

$output .= $trans[$str[$i]];

}

//return $output;

echo $output;

}

trans("программирование");

echo '<br/><br/>';

?>

Двести раз поверял - ничего не помогает ! Кто знает - исправьте пожалуйста ошибку .

Ragnarok
На сайте с 25.06.2010
Offline
239
#1

пользуюсь такой


function latin ($title){
$trans = array( 'а' => 'a', 'б' => 'b', 'в' => 'v',
'г' => 'g', 'д' => 'd', 'е' => 'e',
'ё' => 'e', 'ж' => 'zh', 'з' => 'z',
'и' => 'i', 'й' => 'j', 'к' => 'k',
'л' => 'l', 'м' => 'm', 'н' => 'n',
'о' => 'o', 'п' => 'p', 'р' => 'r',
'с' => 's', 'т' => 't', 'у' => 'u',
'ф' => 'f', 'х' => 'h', 'ц' => 'c',
'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch',
'ь' => '', 'ы' => 'y', 'ъ' => '',
'э' => 'e', 'ю' => 'yu', 'я' => 'ya',
'А' => 'a', 'Б' => 'b', 'В' => 'v',
'Г' => 'g', 'Д' => 'd', 'Е' => 'e',
'Ё' => 'e', 'Ж' => 'zh', 'З' => 'z',
'И' => 'i', 'Й' => 'j', 'К' => 'k',
'Л' => 'l', 'М' => 'm', 'Н' => 'n',
'О' => 'o', 'П' => 'p', 'Р' => 'r',
'С' => 's', 'Т' => 't', 'У' => 'u',
'Ф' => 'f', 'Х' => 'h', 'Ц' => 'c',
'Ч' => 'ch', 'Ш' => 'sh', 'Щ' => 'sch',
'Ь' => '', 'Ы' => 'y', 'Ъ' => '',
'Э' => 'e', 'Ю' => 'yu', 'Я' => 'ya',);
$titletr=strtr($title, $trans);
$titletr=preg_replace ("/[^a-zA-Z0-9]/"," ",$titletr);
$titletr=preg_replace ("/\s+/"," ",$titletr);
$titletr=strtr(trim($titletr)," ","_");
$titletr=strtolower(strtr($titletr,"__","_"));
return $titletr;
}
//TODO: перестать откладывать на потом
LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#2

Я такую юзаю:

function translit($st)  

{
$st = mb_strtolower($st, "utf-8");
$st = str_replace(array(
'?','!','.',',',':',';','*','(',')','{','}','[',']','%','#','№','@','$','^','-','+','/','\\','=','|','"','\'',
'а','б','в','г','д','е','ё','з','и','й','к',
'л','м','н','о','п','р','с','т','у','ф','х',
'ъ','ы','э',' ','ж','ц','ч','ш','щ','ь','ю','я'
), array(
'-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-','-',
'a','b','v','g','d','e','e','z','i','y','k',
'l','m','n','o','p','r','s','t','u','f','h',
'j','i','e','-','zh','ts','ch','sh','shch',
'','yu','ya'
), $st);
$st = preg_replace("/[^a-z0-9_-]/", "", $st);
$st = trim($st, '-');
/* Удаляем одиночные буквы
$prev_st = '';
do
{
$prev_st = $st;
$st = preg_replace("/_[a-z0-9]_/", "_", $st);
}
while($st != $prev_st);
*/
$st = preg_replace("/-{2,}/", "-", $st);
return $st;
}
✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
B
На сайте с 13.02.2008
Offline
262
#3

В вашем примере проблема из-за кодировки (предполагается однобайтовая), а вреале используется многобайтовая utf-8.

Поменяйте цикл на:

for ($i = 0; $i < mb_strlen($str); $i++) {

$output .= $trans[mb_substr($str, $i, 1)];

}

и всё заработает. В общем используйте ф-ции для многобайтовых кодировок.

Ragnarok
На сайте с 25.06.2010
Offline
239
#4

по сабжу, не так брали символ в строке, исправьте в цикле


$output .= $trans[mb_substr($str, $i, 1, "UTF-8")];
U
На сайте с 09.04.2015
Offline
28
#5

Лучше будет через replace с двумя массивами, в Вашем же случае если в строке будут непредусмотренные символы, они удалятся. Либо так:

$output.= ((isset($trans[mb_substr($str,$i,1)])) ? $trans[mb_substr($str,$i,1)] : mb_substr($str,$i,1));

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий