function translitIt($str)
{
$tr = array(
"А"=>"A","Б"=>"B","В"=>"V","Г"=>"G",
"Д"=>"D","Е"=>"E","Ж"=>"J","З"=>"Z","И"=>"I",
"Й"=>"Y","К"=>"K","Л"=>"L","М"=>"M","Н"=>"N",
"О"=>"O","П"=>"P","Р"=>"R","С"=>"S","Т"=>"T",
"У"=>"U","Ф"=>"F","Х"=>"H","Ц"=>"TS","Ч"=>"CH",
"Ш"=>"SH","Щ"=>"SCH","Ъ"=>"","Ы"=>"YI","Ь"=>"",
"Э"=>"E","Ю"=>"YU","Я"=>"YA","а"=>"a","б"=>"b",
"в"=>"v","г"=>"g","д"=>"d","е"=>"e","ж"=>"j",
"з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
"м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
"с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h",
"ц"=>"ts","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"y",
"ы"=>"yi","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya"
);
return strtr($str,$tr);
}
Думаю не трудно понять суть работы этой функции.
function translitIt($str)
{
$tr = array(
"А"=>"a","Б"=>"b","В"=>"v","Г"=>"g",
"Д"=>"d","Е"=>"e","Ж"=>"j","З"=>"z","И"=>"i",
"Й"=>"y","К"=>"k","Л"=>"l","М"=>"m","Н"=>"n",
"О"=>"o","П"=>"p","Р"=>"r","С"=>"s","Т"=>"t",
"У"=>"u","Ф"=>"f","Х"=>"h","Ц"=>"ts","Ч"=>"ch",
"Ш"=>"sh","Щ"=>"sch","Ъ"=>"","Ы"=>"yi","Ь"=>"",
"Э"=>"e","Ю"=>"yu","Я"=>"ya","а"=>"a","б"=>"b",
"в"=>"v","г"=>"g","д"=>"d","е"=>"e","ж"=>"j",
"з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
"м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
"с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h",
"ц"=>"ts","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"y",
"ы"=>"yi","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya",
" "=> "_", "."=> "", "/"=> "_"
);
return strtr($str,$tr);
}
if (preg_match('/[^A-Za-z0-9_\-]/', $urlstr)) {
$urlstr = translitIt($urlstr);
$urlstr = preg_replace('/[^A-Za-z0-9_\-]/', '', $urlstr);
}
купить духи нина ричи в интернет магазине
Комментарии
А вы свой текст, случайно не прогоняли через функцию, которая убирает знаки препинания? ;)
Ага ","=>"" Зато вы теперь знаете как это сделать.
спс все четко ,добавте еще "ё"=>"e" и ";"=>"" ":"=>""для url
Кстати можно всё сделать и свитчём большим)
Вы наверно сделали так когда-то, раз догадались такое предложить :)
Инженеры велосипедных наук.
iconv("UTF-8", "ISO-8859-1//TRANSLIT", $text)kirilloid, с кем не бывает :)
решение с использованием iconv красивое, но у меня выдает:
Notice: iconv() [function.iconv]: Detected an illegal character in input string
кто может посоветовать, что с этой бедой делать?
объясните мне а где тут ру текст вставлять, и как результат в базу записать, далек от этого но оч надо - СПАСИБО!
КСТАТИ КИРИЛОИД ПРАВИЛЬНО НАПИСАЛ. Я ВТОРОЙ РАЗ СТЫКАЮСЬ С ПОИСКАМИ ТАКОЙ ФУНКЦИИ. И Я ЕЕ СНОВА НАШЕЛ. GOOGLE НАШЕЛ, НЕ ЯНДЕКС. ИБО ЯНДЕКС - ХУЙНЯ!
Кстати то что kirilloid сказал у меня не работает на локалхосте и VPS'е (OpenSUSE) (на dreamhost'е работает), согласен, может руки кривые что бы настроить локаль правильно, но на самом деле не кривые а просто не доходят, а старая добрая функция translitIt работает везде.
Поздравляю admin! У меня тоже ничего не работает iconv! Завтра придется вашу реализацию брать, плюс дописывать "є,ї,і". Поработав день с кодировками, понял, кокой-же РНР гавно!! Например iconv, strtolower, strtr так и не заработали в Юникодовом русско-украинском окружении. Всех придется перекрыть. Будем на Python надеятся.
(windows xp, xampp, netBeans)
Не ну тут придется повториться, php говно - не говно, руки ровные никто не отменял. На хостингах и на "преднастроенных" серверах iconv работает и все остальное.
Спасибо за функциюstrtolower - попробуйте mb_strtolowericonv("UTF-8", "ISO-8859-1//TRANSLIT", $text) - тупо не везде работает
Что касается
А чтобы не изобретать велосипеды с UTF8, да и просто в свежих PHP, можно просто использовать функцию str_replace. Вот как то так:
function translite($string) {
$rus = array("ё","й","ю","ь","ч","щ","ц","у","к","е","н","г","ш","з","х","ъ","ф","ы","в","а","п","р","о","л","д","ж","э","я","с","м","и","т","б","Ё","Й","Ю","Ч","Ь","Щ","Ц","У","К","Е","Н","Г","Ш","З","Х","Ъ","Ф","Ы","В","А","П","Р","О","Л","Д","Ж","Э","Я","С","М","И","Т","Б");
$eng = array("yo","iy","yu","'","ch","sh","c","u","k","e","n","g","sh","z","h","'","f","y","v","a","p","r","o","l","d","j","е","ya","s","m","i","t","b","Yo","Iy","Yu","CH","'","SH","C","U","K","E","N","G","SH","Z","H","'","F","Y","V","A","P","R","O","L","D","J","E","YA","S","M","I","T","B");
$string = str_replace($rus, $eng, $string);
/***
функция str_replace находит значения в строке и заменяет их новой. здесь мы повторили весь алфавит, как видите ::):
***/
if(!empty($string)) {
return $string;
} // если строка не пуста, возвращаем строку
else return("String empty/Строка пуста"); // а если пуста, орем во всю глотку xD
}
Взял отсюда: http://jarmush.ru/node/166
cicada, что бы не писать такую ерунду, читать пост нужно и хотя бы немного разбираться в теме. Я имею ввиду что то типа "слышишь звон, не знаешь где он"..
WEB-IGNITER: Поработав день с кодировками, понял, кокой-же РНР гавно!! Например iconv, strtolower, strtr так и не заработали в Юникодовом
русско-украинском окружении. Всех придется перекрыть. Будем на Python
надеятся.
Когда руки не анатомически растут, то даже Python не поможет. С юникодными строками надо работать функциями с префиксом mb_
<?php
/*******************************************************************************
Filename : str_lib.inc
Created : 01 March 2010 (20:25:44)
Created by : atomheart
Last Updated : 14 March 2010 (17:47:08)
Updated by : atomheart
Comments : String Libriry
*******************************************************************************/
/** функции для безопасной обработки строк ********************************/
/**************************************************************************/
// константы, определяющие тип замены специальных символов html:
define("STXT_HTML_NO", 0); // без замены спецсимволов
define("STXT_HTML_ENT", 1); // преобразует все символы в соответствющие HTML сущности
define("STXT_HTML_SPEC", 2); // преобразует специальные символы в соответствющие HTML сущности
// экранирует специальные символы и меняет тип переносов на новую строку для текста:
function safeText($str, $htmlspec = STXT_HTML_NO) {
$text = stripslashes($str);
// new line specialchar:
// $text = str_replace(chr(13), "", $text);
// $text = str_replace("n", "\n", $text);
$text = str_replace(chr(13) . chr(10), "\n", $text);
$text = str_replace(chr(10), "\n", $text);
$text = str_replace(chr(13), "\n", $text);
// slash correction:
$text = str_replace("/", "/", $text);
// html entities:
$text = ($htmlspec == STXT_HTML_ENT) ? htmlentities($text, ENT_NOQUOTES) : $text;
$text = ($htmlspec == STXT_HTML_SPEC) ? htmlspecialchars($text, ENT_NOQUOTES) : $text;
// quotes:
$text = str_replace('"', '"', $text);
return $text;
}
function ru2lat($string) {
// шипящие, сопящие и некоторые гласные:
$rus = array('ё','ж','ц','ч','ш','щ','ю','я','Ё','Ж','Ц','Ч','Ш','Щ','Ю','Я');
$lat = array('yo','zh','tc','ch','sh','sh','yu','ya','YO','ZH','TC','CH','SH','SH','YU','YA');
$string = str_replace($rus, $lat , $string);
// остальной алфавит:
$string = strtr($string,
"АБВГДЕЗИЙКЛМНОПРСТУФХЪЫЬЭабвгдезийклмнопрстуфхъыьэ",
"ABVGDEZIJKLMNOPRSTUFH_I_Eabvgdezijklmnoprstufh_i_e");
return($string);
}
// Таблица русского алфавита:
$trans_table_ru = array(
'А', 'а', 'Б', 'б', 'В', 'в', 'Г', 'г', 'Д', 'д', 'Е', 'е', 'Ё', 'ё',
'Ж', 'ж', 'З', 'з', 'И', 'и', 'Й', 'й', 'К', 'к', 'Л', 'л', 'М', 'м',
'Н', 'н', 'О', 'о', 'П', 'п', 'Р', 'р', 'С', 'с', 'Т', 'т', 'У', 'у',
'Ф', 'ф', 'Х', 'х', 'Ц', 'ц', 'Ы', 'ы', 'Э', 'э', 'Ч', 'ч', 'Ш', 'ш',
'Щ', 'щ', 'Ю', 'ю', 'Я', 'я'
);
// Таблица латинского алфавита для адекватной замены букв (транслит):
$trans_table_lat = array(
'A', 'a', 'B', 'b', 'V', 'v', 'G', 'g', 'D', 'd', 'E', 'e', 'E', 'e',
'J', 'j', 'Z', 'z', 'I', 'i', 'Y', 'y', 'K', 'k', 'L', 'l', 'M', 'm',
'N', 'n', 'O', 'o', 'P', 'p', 'R', 'r', 'S', 's', 'T', 't', 'U', 'u',
'F', 'f', 'H', 'h', 'C', 'c', 'I', 'i', 'E', 'e',
'Ch', 'ch', 'Sh', 'sh', 'Sh', 'sh', 'Yu', 'yu', 'Ya', 'ya'
);
function getTransName($str) {
global $trans_table_ru, $trans_table_lat;
// заменяем пробелы на знак подчерка:
$str = str_replace(" ", "_", $str);
// Убираем все не алфавитные символы, а также некоторые непроизносимые:
$str = preg_replace('/W|Ь|ь|Ъ|ъ/i', '', $str);
// убираем все дублирующиеся подчерки (нам они не нужны):
$str = preg_replace('/_+/', '_', $str);
// обрезаем строку:
$str = trim($str, "_");
// переводим русские символы в аналогичные латинские по определеным выше
// правилам:
$str = str_replace($trans_table_ru, $trans_table_lat, $str);
// переводим в нижний регистр:
$str = strtolower($str);
return $str;
}
/**
* Внимание: в версии PHP <4.3.3 есть проблема с функцией str_replace.
* Эта проблема связана с пустыми элементами массивов.
* Есть фукнция strtr, предназначенная для замены пар символов, но для нее
* нужно определить массив с элементами 'Ш'->'SH'
* Зато проблем не будет и можно использовать маски для разных языков
* и случаев.
* В общем, нужно переписать!!!
*/
/**************************************************************************/
?>
Блин. Вот ещё вариант для UTF-8.
Функцию translit оставить как есть (...strtr, etc) сохранить в отдельный файл в кодировке допустим CP1251.
а в начале обработки конвертировать строку из UTF-8 в CP1251, и в конце соответственно - обратно...
Хех, блин...
Текст, который пишу на транслите, выдает мне теги <div>, как их удалить? не могу найти функцию хотябы уже замены на <p> .
Iryna, не знаю, это точно в вашем коде где-то. Если хотите просто убрать и не париться откуда он берется, можно сделать:
Э.. А зачем нам вообще в массив совать заглавные буквы, если транлитерация делается дл ЧПУ? Как бы совсем незачем. Следовательно перед определением массива вставляем $трока для замены = mb_strtolower($строка для замены); и далее заменяем только прописные. Ну и смотрим перед определением массива сюда http://transliteration.ru/iso_for_url/ чтобы не по своим правилам делать, а как положено.