Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Как организовать транскрипцию слов для вставки в БД?
Форумы портала PHP.SU » » Хранение данных, их вывод и обработка » Как организовать транскрипцию слов для вставки в БД?

Страниц (1): [1]
 

1. Kubert - 22 Апреля, 2010 - 16:43:20 - перейти к сообщению
Есть своя админка, необходимо при добавлении новой страны или курорта происходила автоматическая транскрипция названий.
Пример:
Хочу добавить страну Италия
Ввожу несколько фрм с описанием и прочее... И хочу чтобы страница выглядела таким образом
www[dot]сайт[dot]ru/country_view.php?id=italiya

С добавлением конечно проблем нет. но вот с транскрипцией возник вопрос... Логично можно предположить, что каждый символ перевести в "транскриптизированный" символ. типа:
И = I,
и = i,
Т = T
T = t
И так далее...

Помогите пж.

Нужно для того что бы сайт был более оптимизирован для ПС.
спасибо
2. ZeiZ - 22 Апреля, 2010 - 17:22:28 - перейти к сообщению
Могут долго меня пинать за это, но я сделал что-то так:
(не для ссылок, а для создания директорий на сервере)

PHP:
скопировать код в буфер обмена
  1.  
  2. # Играем с транслитом
  3. $translate = $_POST['name'];
  4. $ruswords = array("а","б","в","г","д","е","ё","ж","з","и","й","к","л","м","н","о","п","р","с","т","у","ф","х","ц","ч","ш","щ","ъ","ы","ь","э","ю","я");
  5. $ruswords_big = array("А","Б","В","Г","Д","Е","Ё","Ж","З","И","Й","К","Л","М","Н","О","П","Р","С","Т","У","Ф","Х","Ц","Ч","Ш","Щ","Ъ","Ы","Ь","Э","Ю","Я");
  6. $translit = array("a","b","v","g","d","e","e","j","z","i","y","k","l","m","n","o","p","r","s","t","u","f","h","c","ch","sh","sh","","i","","e","y","ya");
  7. $specialsymbols = array(" ","!","№",";","%",":","?","*","=","@","#","$","^","&amp","~",",","&quot","'","&gt","&lt","\"");
  8. $translit_specs = array("_","","n","","","","","x","","a","","s","","and","","_","","","(",")","");
  9.  
  10. // Меняем большие буковки на маленькие
  11. for($i=0; $i<33; $i++)
  12. {
  13. $translate = str_replace($ruswords_big[$i],$ruswords[$i],$translate);
  14. }
  15. // Меняем на транслит
  16. for($i=0; $i<33; $i++)
  17. {
  18. $translate = str_replace($ruswords[$i],$translit[$i],$translate);
  19. }
  20. // Меняем спецсимволы
  21. for($i=0; $i<33; $i++)
  22. {
  23. $translate = str_replace($specialsymbols[$i],$translit_specs[$i],$translate);
  24. }
  25. $translate = strtolower($translate);
  26. #echo ("СТАЛО:<br />".$translate."<hr>БЫЛО:<br />".$_POST['name']);


Если у кого есть лучше решение, с удовольствием посмотрю.
(Добавление)
А вообще id=italia или id=15 ИМХО для ПС разницы никакой.
более 9000 раз обсуждалось, что не ЧПУ не всякие другие примочки на ЦИТ не влияют, зато для базы будет проще вынуть идшник чем слово + id (AI) повторяться не может в отличии от слов.
3. Kubert - 23 Апреля, 2010 - 11:10:14 - перейти к сообщению
спасибо, попробую.
4. JustUserR - 23 Апреля, 2010 - 12:00:33 - перейти к сообщению
Kubert Вы можете конечно использовать транслитерированные названия если вам удобно - однако в БД первичным ключтом для поиска должен оставаться ID (Для ускорения поиска) - а также длина транслитерированного названия должна быть ограничена (А то получите HTTP error 414 - слишком длинный GET-запрос)
ZeiZФункция хорошая - но я бы заменял "ж"=>"zh" и "й"=>"j" (Чтобы было взаимно-однозначное преобразование в обратную сторону)
Кроме того можно обойтись без циклом с использованием функции http://php.su/functions/?strtr
5. Kubert - 24 Апреля, 2010 - 23:06:26 - перейти к сообщению
JustUserR пишет:
Kubert Вы можете конечно использовать транслитерированные названия если вам удобно - однако в БД первичным ключтом для поиска должен оставаться ID (Для ускорения поиска) - а также длина транслитерированного названия должна быть ограничена (А то получите HTTP error 414 - слишком длинный GET-запрос)
ZeiZФункция хорошая - но я бы заменял "ж"=>"zh" и "й"=>"j" (Чтобы было взаимно-однозначное преобразование в обратную сторону)
Кроме того можно обойтись без циклом с использованием функции http://php.su/functions/?strtr


Спасибо за ответ. Вы правы что намного разумнее что бы первичный ключ был ID, это мне понятно. М нет необходимости делать первичным ключем трансл....ющие слова. Мне они необходимы только для урла.
6. JustUserR - 25 Апреля, 2010 - 12:01:44 - перейти к сообщению
Kubert пишет:
Спасибо за ответ. Вы правы что намного разумнее что бы первичный ключ был ID, это мне понятно. М нет необходимости делать первичным ключем трансл....ющие слова. Мне они необходимы только для урла
Пожалуйста! В таком случае вы можете оставлять все как есть - только для транслитерации быстрее все-таки использовать вышеприведенную функцию - поскольку если в ней и есть циклы то это не циклы интерпретируемого PHP а более низкоуровневые и как следствие более быстрые
7. Viper - 26 Апреля, 2010 - 08:23:09 - перейти к сообщению
JustUserR пишет:
но я бы заменял "ж"=>"zh" и "й"=>"j"


ГОСТ смотрели ? видимо нет.
й => jj
ж => j
8. ZeiZ - 26 Апреля, 2010 - 11:27:00 - перейти к сообщению

Viper
Это Где Вы нашли такой ГОСТ?

ГОСТ 7.79—2000:

zh ж
j й
9. Viper - 26 Апреля, 2010 - 12:09:32 - перейти к сообщению
ZeiZ ГОСТ 16876-71
10. JustUserR - 26 Апреля, 2010 - 12:55:18 - перейти к сообщению
Viper пишет:
ГОСТ смотрели ? видимо нет.
й => jj
ж => j
Действительно не смотрел - спасибо за интересную ссылку на ГОСТ Однако я действительно верно подметил что буквы Ы и Й должны заменяться разными транслитерированными аналогами - иначе не получится однозначного соответствия при обратном переводе текста
11. ZeiZ - 26 Апреля, 2010 - 17:32:19 - перейти к сообщению
Viper

ГОСТ 7.79-2000

Дата введения: 07/01/2002

Взамен ГОСТ 16876-71.
http://orwell[dot]ru/info/tliter[dot]html
12. JustUserR - 27 Апреля, 2010 - 13:29:51 - перейти к сообщению
ZeiZ пишет:
Viper ГОСТ 7.79-2000 Дата введения: 07/01/2002
Взамен ГОСТ 16876-71. http://orwell.ru/info/tliter.html
В общем-то судя по приведенной по ссылке таблице - вариант транслитерации указанные выше является верным только нужно проихвести две замены И кстати как я верно заметил одним из свойств транслитерации обязано быть то - что должна быть однозачная обратная восстанавливаемость - чего также не было в первоначальном варианте
13. 0931454574 - 24 Апреля, 2011 - 17:53:21 - перейти к сообщению
Есть более простой способ создания транслита русских слов в латынь) привожу ниже пример.

Функция php strtr

PHP:
скопировать код в буфер обмена
  1. $s = array (" "=>"_");
  2. $pr = "hello o portick fsfsdf fsf !";
  3.  
  4. echo strtr ($pr,$s);

Эта функция меняет все символы в строке на их значение в ассоциативном массиве(пробелы на подчеркивание). Лучше прочесть документацию.

Но скажем массив переменных на которые нужно заменить буквы может выглядить так



и подставляем его в значение для функции strtr! Вот и все) гораздо проще. Кстати проверял на быстродействие и предложенный здесь вариант хуже!
14. Haron - 25 Апреля, 2011 - 09:44:05 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. function translit($str)
  2. {
  3.     $tr = array(
  4.         'А'=>'A','Б'=>'B','В'=>'V','Г'=>'G',
  5.         'Д'=>'D','Е'=>'E','Ж'=>'J','З'=>'Z','И'=>'I',
  6.         'Й'=>'Y','К'=>'K','Л'=>'L','М'=>'M','Н'=>'N',
  7.         'О'=>'O','П'=>'P','Р'=>'R','С'=>'S','Т'=>'T',
  8.         'У'=>'U','Ф'=>'F','Х'=>'H','Ц'=>'TS','Ч'=>'CH',
  9.         'Ш'=>'SH','Щ'=>'SCH','Ъ'=>'','Ы'=>'YI','Ь'=>'',
  10.         'Э'=>'E','Ю'=>'YU','Я'=>'YA','а'=>'a','б'=>'b',
  11.         'в'=>'v','г'=>'g','д'=>'d','е'=>'e','ж'=>'j',
  12.         'з'=>'z','и'=>'i','й'=>'y','к'=>'k','л'=>'l',
  13.         'м'=>'m','н'=>'n','о'=>'o','п'=>'p','р'=>'r',
  14.         'с'=>'s','т'=>'t','у'=>'u','ф'=>'f','х'=>'h',
  15.         'ц'=>'ts','ч'=>'ch','ш'=>'sh','щ'=>'sch','ъ'=>'y',
  16.         'ы'=>'yi','ь'=>'','э'=>'e','ю'=>'yu','я'=>'ya', ' ' => '_'
  17.     );
  18.     return strtr($str,$tr);
  19. }


Вот и весь транслит.
15. Чечако - 09 Мая, 2011 - 01:09:49 - перейти к сообщению
силы небесные, justuser отвечает как простой смертный.

 

Powered by ExBB FM 1.0 RC1