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

Форум Регулярные Выражения

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

 

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

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

тема: Замена транслита без затрагивания смайликов
 
 автор: Unkind   (04.02.2007 в 00:18)   письмо автору
 
 

Хотелось бы решить одну задачу малой кровью.
Можно ли реализовать след. задачу с помощью preg_replace_callback()?


<?php
//Callback-функция
function translitiration($array)
{
//Какой-то код
return $array[0];
}

//Смешанный текст: то, что нужно транслитировать и то, что НЕ нужно (смайлы)
$string "translit .smile. translit";

//А можно ли придумать рег. выражение, которое нужное для решения моей задачи?
$string preg_replace_callback("""translitiration"$string);

//Должно получится что-то вроде "транслит .smile. транслит"
?>


Если точно нельзя, то просьба так и ответить ;)

   
 
 автор: cheops   (04.02.2007 в 00:23)   письмо автору
 
   для: Unkind   (04.02.2007 в 00:18)
 

Что-то не очень понятна задача.

   
 
 автор: Unkind   (04.02.2007 в 00:27)   письмо автору
 
   для: cheops   (04.02.2007 в 00:23)
 

Ну, допустим, пользователь вводит текст латинскими буквами (на некоторых мобильниках нет ввода кириллицы), а также вставляет смайлы (например, ".smile.").
Далее идет преобразование смайлов. Если я тупо сделаю транcлитерацию, то выйдет ".смиле." и смайл не будет преобразован в <img src='...' alt='...' />

   
 
 автор: kasmanaft   (04.02.2007 в 09:06)   письмо автору
 
   для: Unkind   (04.02.2007 в 00:27)
 

>> Если точно нельзя, то просьба так и ответить ;)
А если можно как отвечать? Если нужно было ответить "можно", то дальше не читайте - можно! ;-)


Подойдет обычное "#[a-z\.]+#is ", а в translitiration() смотрим - 
первая и последняя "буквы" попавшего слова - точки: значит не транслитируем его.

   
 
 автор: Unkind   (04.02.2007 в 13:32)   письмо автору
 
   для: kasmanaft   (04.02.2007 в 09:06)
 

Хороший вариант, но единственно, если будет translit.smile. (слитно), то не сработает...

   
 
 автор: bronenos   (11.02.2007 в 08:21)   письмо автору
 
   для: Unkind   (04.02.2007 в 13:32)
 

замените этот .smile. каким нибудь [@], переведите все на русский и потом [@] замените на код..

   
 
 автор: Unkind   (15.02.2007 в 01:01)   письмо автору
 
   для: bronenos   (11.02.2007 в 08:21)
 

Хех, нет уж, пасиба.

   
 
 автор: Unkind   (10.03.2007 в 00:57)   письмо автору
 
   для: Unkind   (15.02.2007 в 01:01)
 

Пришлось лить кровь. :)


<?php
$msg 
"translit <img src='/smiles/smile.gif' alt='DO NOT TOUCH ME!' /> translit";

function 
transliteration($message)
{
$array = array(
"Jo" => "Ё",
"jo" => "ё",
"Yo" => "Ё",
"yo" => "ё",
"Zh" => "Ж",
"zh" => "ж",
"*" => "ж",
"Ch" => "Ч",
"ch" => "ч",
"Sh" => "Ш",
"sh" => "ш",
"Shc" => "Щ",
"shc" => "щ",
"''" => 'ъ',
"'" => "ь",
"Ye" => "Э",
"ye" => "э",
"Yu" => "Ю",
"yu" => "ю",
"Ya" => "Я",
"ya" => "я",
"X" => "Ы",
"x" => "ы",

"A" => "А",
"a" => "а",
"B" => "Б",
"b" => "б",
"C" => "Ц",
"c" => "ц",
"D" => "Д",
"d" => "д",
"E" => "Е",
"e" => "е",
"F" => "Ф",
"f" => "ф",
"G" => "Г",
"g" => "г",
"H" => "Х",
"h" => "х",
"I" => "И",
"i" => "и",
"K" => "К",
"k" => "к",
"L" => "Л",
"l" => "л",
"M" => "М",
"m" => "м",
"N" => "Н",
"n" => "н",
"O" => "О",
"o" => "о",
"P" => "П",
"p" => "п",
"Q" => "Ь",
"q" => "ь",
"R" => "Р",
"r" => "р",
"S" => "С",
"s" => "с",
"T" => "Т",
"t" => "т",
"U" => "У",
"u" => "у",
"V" => "В",
"v" => "в",
"W" => "Ш",
"w" => "ш",
"Y" => "У",
"y" => "у",
"Z" => "З",
"z" => "з"
);

    for(
$i 0$i count($message); $i++)
    {
    if(empty(
$message[$i])) continue;
    if(
$message[$i][0] != "<"$message[$i] = strtr($message[$i], $array);
    }

return 
implode(""$message);
}

$message = array();
$position 0;

while(
true)
{
$part_of_msg substr($msg$position);
$pos strpos($part_of_msg"<");

    if(
$pos !== false)
    {
    
$message[] = substr($part_of_msg0$pos); 
    
$message[] = substr($part_of_msg$posstrpos($part_of_msg">") - $pos 1);
    
$position strlen(implode(""$message));
    }
    else
    {
    
$message[] = $part_of_msg;
    break;
    }
}

echo 
transliteration($message);
?>

   
Rambler's Top100
вверх

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