За последние 24 часа нас посетили 36682 программиста и 1712 роботов. Сейчас ищут 888 программистов ...

В транслите кукожится "длинного тире", а какие еще символы?

Тема в разделе "PHP для новичков", создана пользователем minux, 1 фев 2013.

  1. minux

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

    С нами с:
    14 май 2012
    Сообщения:
    89
    Симпатии:
    1
    Загоняю текст в транслит.
    Удаляю все символы "не цифра и не буква".

    Велосипедно конечно, но транслит через iconv() у меня не работает.

    Код (Text):
    1. #транслит
    2. $translit = array("а"=>"a","б"=>"b","в"=>"v","г"=>"g","д"=>"d","е"=>"e", "ё"=>"yo","ж"=>"j","з"=>"z","и"=>"i","й"=>"i","к"=>"k","л"=>"l", "м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r","с"=>"s","т"=>"t", "у"=>"y","ф"=>"f","х"=>"h","ц"=>"c","ч"=>"ch", "ш"=>"sh","щ"=>"sh","ы"=>"i","э"=>"e","ю"=>"u","я"=>"ya",
    3.   "А"=>"A","Б"=>"B","В"=>"V","Г"=>"G","Д"=>"D","Е"=>"E", "Ё"=>"Yo","Ж"=>"J","З"=>"Z","И"=>"I","Й"=>"I","К"=>"K", "Л"=>"L","М"=>"M","Н"=>"N","О"=>"O","П"=>"P", "Р"=>"R","С"=>"S","Т"=>"T","У"=>"Y","Ф"=>"F", "Х"=>"H","Ц"=>"C","Ч"=>"Ch","Ш"=>"Sh","Щ"=>"Sh", "Ы"=>"I","Э"=>"E","Ю"=>"U","Я"=>"Ya",
    4.   "ь"=>"","Ь"=>"","ъ"=>"","Ъ"=>"");
    5.  
    6. $file_name=strtr($postname, $translit);
    7.  
    8. #ликвидация спец-символов в имени файла
    9. $file_name=preg_replace("#\W#","-",$file_name); //не_буквы и не_цифры заменить на тире
    10. $file_name=preg_replace("#_#","-",$file_name); //нижнее подчеркивание заменить на тире
    11. $file_name=preg_replace("#-{2,}#","-",$file_name); //два и более тире заменить одним
    12. $file_name=trim($file_name); //трим
    13.  
    14. #имя файла в нижний регист
    15. $file_name=strtolower($file_name); //все в нижний регистр
    На выхлопе из:
    Mercedes C63 AMG – показана самая крутая версия
    Получаю такое:
    mercedes-c63-amg-вђ-pokazana-samaya-krytaya-versiya

    "Длинное тире" превращается в вђ.
    Снес его перед загоном в транслит.

    А теперь вопрос:
    С какими еще символами нужно повоевать перед отправкой текста в транслит?


    смотреть <a href='http://vtraxe.com'>порно онлайн</a> | <a href='http://www.indreamsphuket.ru/arenda-villy-na-phukete/'>Аренда вилл на Пхукете</a> | просмотр <a href='http://gigporno.com/'>анальный мужчина</a> порно

     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Re: В транслите кукожится "длинного тире", а какие еще симво

    ну если бы ты буквально сделал "не буквы и не цифры...." не было бы такой проблемы.
    кстати, последние два preg_replace замени на один trim
     
  3. minux

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

    С нами с:
    14 май 2012
    Сообщения:
    89
    Симпатии:
    1
    Re: В транслите кукожится "длинного тире", а какие еще симво

    Я вроде так и сделал:
    preg_replace("#\W#","-",$file_name); //не_буквы и не_цифры заменить на тире

    Или статья про регулярки меня обманула?
    В статье про регулярки википедии так написано:
    \W [^[:word:]] Любой символ, кроме буквенного или цифрового символа или знака подчеркивания.

    Навылезало еще много мусора, "русские кавычки" тоже скукоживаются в кракозябру...
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Реальность тебя не убеждает, похоже. Сделай буквально "не буквы и не цифры", не надо умничать. После strtr
    Код (PHP):
    1. $file_name = strtolower($file_name);
    2. $file_name = preg_replace('#[^0-9a-z]+#', '-', $file_name);
    3. $file_name = trim($file_name, '-');
    4.  
    и всё! больше ничего не надо