Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Грамотный перевод кириллической строки в url на латинице с очисткой от ненужных символов
 
 автор: TetRiska   (31.03.2011 в 18:23)   письмо автору
 
 

Всем привет. Прошу помощи в разработке ф-ции. Я ее написал насколько смог, но она не идеальна, т.к. всевозможные символы невозможно учесть.
function format_url($str=''){

    $fixtext = '';
    
    $nbsp = array(
        "~"=>" ","`"=>" ","!"=>" ","@"=>" ",'"'=>" ","#"=>" ","№"=>" ",
        "$"=>" ",";"=>" ","%"=>" ","^"=>" ",":"=>" ","&"=>" ","?"=>" ",
        "*"=>" ","("=>" ",")"=>" ","-"=>" ","_"=>" ","+"=>" ","="=>" ",
        "|"=>" ","["=>" ","]"=>" ","{"=>" ","}"=>" ","'"=>" ",","=>" ",
        "."=>" ","<"=>" ",">"=>" ","/"=>" ","»"=>" ","«"=>" ","–"=>" ",
        "&quot;"=>" ","&nbsp;"=>" ","•"=>" ","\\"=>" ","—"=>" "
    );
    
    $str = strtr(strip_tags($str),$nbsp);
    
    $trans_arr = explode(" ", $str);
    
    $symbol = array(
        "~"=>"","`"=>"","!"=>"","@"=>"",'"'=>"","#"=>"","№"=>"",
        "$"=>"",";"=>"","%"=>"","^"=>"",":"=>"","&"=>"","?"=>"",
        "*"=>"","("=>"",")"=>"","-"=>"","_"=>"","+"=>"","="=>"",
        "|"=>"","["=>"","]"=>"","{"=>"","}"=>"","'"=>"",","=>"",
        "."=>"","<"=>"",">"=>"","/"=>"","»"=>"","«"=>"","–"=>"",
        "&quot;"=>"","&nbsp;"=>"","•"=>"","\\"=>"","—"=>""
    );
    
    for($i=0;$i<count($trans_arr);$i++){
        if(strtr($trans_arr[$i],$symbol) != ''){
            $clear[] = strtr($trans_arr[$i],$symbol);
        }
    }
    
    $p = 0;
    for($j=0;$j<count($clear);$j++){
        $p++;
        $add = ($p !=  count($clear))?"-":"";
        if($clear[$j] != ""){
            $fixtext .= $clear[$j].$add;
        }
    }
    
    $translit = array(
        "а"=>"a","б"=>"b","в"=>"v","г"=>"g","ґ"=>"g","д"=>"d",
        "е"=>"e","є"=>"e","ё"=>"e","ж"=>"zh","з"=>"z","и"=>"i",
        "і"=>"i","ї"=>"i","й"=>"i","к"=>"k","л"=>"l","м"=>"m","н"=>"n",
        "о"=>"o","п"=>"p","р"=>"r","с"=>"s","т"=>"t","у"=>"u",
        "ф"=>"f","х"=>"h","ц"=>"ts","ч"=>"ch","ш"=>"sh","щ"=>"sch",
        "ъ"=>"","ы"=>"y","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya", "ей"=>"yei"
    );
    
    $fixtext = str_replace('\r\n','',mysql_real_escape_string($fixtext));
    
    return strtr(mb_strtolower($fixtext,"UTF-8"),$translit);
}

Если переписывать все символы, это глупо как по мне, если я уже три вида тире вписал в массив фильтрации.

Пробовал пойти иным путем. Создать массив и туда запихнуть весь укр алфавит + часть из ру алфавита, что не повторяется и аналогично енг алфавит. Потом начал думать-писать, получается в алфавите 65 символов, а если в строке 200 символов, то это сколько придется циклу прокручиваться, чтобы все обойти и проверить.

$strok = "&quot;fff/\\\ \&nbsp;ааа68= quota .   <br>  <br/>    lol \ \яяявс12hEEllo0o+_-)(*&^%$#@!~`«»—•";//строка

$strok = html_entity_decode(strip_tags($strok));//очистка от хтмл+преобразование хтмл сущностей в символы

$alfavit = array("а","б","в","г","ґ","д","е","є","ё","ж","з","и","і","ї","й",
                 "к","л","м","н","о","п","р","с","т","у","ф","х","ц","ч","ш",
                 "щ","ы","э","ю","я","1","2","3","4","5","6","7","8","9","0",
                 "b","d","f","g","h","j","k","l","m","n","q","r","s","t","u",
                 "v","w","z");//массив алфавитов

//цикл в цикл получается в котором идет сравнение строк
for($i=0;$i<strlen($strok);$i++){
    for($j=0;$j<count($alfavit);$j++){
        if(mb_substr($strok, $i, 1, "utf-8") == $alfavit[$j])
            $mass[] = mb_substr($strok, $i, 1, "utf-8");
          }
}

Видать неверно делаю, т.к. сообщение о нехватке памяти появляется через некоторое время. Темболее нужно как и в предыдущем варианте разделять слова одинарным тире, т.е. в результате должно получится так:
fff-ааа68-яяявс12hEEllo0o

Помогите прийти к универсальному методу обработки. Спасибо.

  Ответить  
 
 автор: cheops   (31.03.2011 в 18:41)   письмо автору
 
   для: TetRiska   (31.03.2011 в 18:23)
 

Вот что не понятно, почему бы не воспользоваться функцией urlencode() для кодирования URL?

  Ответить  
 
 автор: TetRiska   (31.03.2011 в 19:03)   письмо автору
 
   для: cheops   (31.03.2011 в 18:41)
 

причем тут она? на выходе же будет
D0%BA%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%

мне не кодировать нужно, а перевести и использовать для СЕО

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования