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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Скрипт не распознает строку на русском

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Ammiak
Отправлено: 07 Сентября, 2011 - 14:59:13
Post Id


Частый гость


Покинул форум
Сообщений всего: 232
Дата рег-ции: Апр. 2011  


Помог: 0 раз(а)




Всем привет, есть скрипт, который во введенной строке находит слова, читающиеся одинаково справа налево и слева направо (палиндромы). Скрипт выводит палиндром максимальной длины. Все работает, но с кодировкой проблема: не воспринимает строки, введенные на русском языке. Вот код:
PHP:
скопировать код в буфер обмена
  1.  
  2. define('ENC', 'UTF-8');
  3.  
  4. function compare_length($str1, $str2) {
  5. $length1 = mb_strlen($str1, ENC);
  6. $length2 = mb_strlen($str2, ENC);
  7. if ($length1 > $length2)
  8. return 1;
  9. }
  10.  
  11. if (!$_POST['stroka']) exit ('Нет данных');
  12. $stroka=trim(htmlspecialchars($_POST['stroka']));
  13. $arr_poly=array();  /*создаем пустой массив для палиндромов*/                                                
  14. $arr = explode(' ', $stroka);  /*разбиваем строку на слова*/
  15. for($i = 0; $i < count($arr); $i++) {
  16. $r=strrev($arr[$i]);      /*читаем слово наоборот*/    
  17. if ($arr[$i]==$r) $arr_poly[]=$r;    /*если палиндром, заносим в массив*/
  18. }
  19.  
  20. usort($arr_poly, "compare_length");
  21. if ($arr_poly) exit(array_pop($arr_poly).'-палиндром максимальной длины.');
  22. echo 'Палиндромы не найдены.';
  23.  

Понятно, что нужно юзать строковые функции библиотеки mb-* и конструкции типа $arr[$i] в многобайтовых не работают, но как исправить код, не знаю...

(Отредактировано автором: 07 Сентября, 2011 - 15:23:34)

 
 Top
LIME
Отправлено: 07 Сентября, 2011 - 15:35:03
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




$r пробовали выводить?
 
 Top
Ammiak
Отправлено: 07 Сентября, 2011 - 15:54:56
Post Id


Частый гость


Покинул форум
Сообщений всего: 232
Дата рег-ции: Апр. 2011  


Помог: 0 раз(а)




$r выводит строку наоборот. Как и нужно
(Добавление)
если строка на русском-на выходе пустота
(Добавление)
Делал скрипт, который просто переворачивает введенное слово: работало со всеми языками:
PHP:
скопировать код в буфер обмена
  1.  
  2. define('ENC', 'UTF-8');
  3. if (!$_POST['word']) echo 'Нет данных';
  4. $word=trim(htmlspecialchars($_POST['word']));
  5. $r = '';
  6. for($i = mb_strlen($word, ENC); $i >= 0; $i--) {
  7. $r .= mb_substr($word, $i, 1, ENC);
  8. }
  9. echo $r;
  10.  

Но здесь задача сложнее и я запутался...
 
 Top
Мелкий Супермодератор
Отправлено: 07 Сентября, 2011 - 16:14:11
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Ammiak пишет:
Но здесь задача сложнее и я запутался...

Почему сложнее?
Сравниваете перевёрнутую строку с исходной - если они совпадают, значит то, то нам нужно.


-----
PostgreSQL DBA
 
 Top
LIME
Отправлено: 07 Сентября, 2011 - 16:14:31
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Ammiak пишет:
если строка на русском-на выходе пустота
естественно интересовала $r при русской строке
видимо strrev не работает с утф
либо пишите свою фцию реверса
либо iconv
(Добавление)
я незнаю что быстрее получится
 
 Top
EuGen Администратор
Отправлено: 07 Сентября, 2011 - 16:29:38
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




PHP:
скопировать код в буфер обмена
  1. $str='ротатор';
  2. var_dump($str==(join('',array_reverse(preg_split('//u',$str, -1, PREG_SPLIT_NO_EMPTY)))));


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
LIME
Отправлено: 07 Сентября, 2011 - 16:35:19
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




там наверное = должно быть?
 
 Top
EuGen Администратор
Отправлено: 07 Сентября, 2011 - 16:37:29
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Нет. Приведенный код покажет bool(true) если строка палинром и bool(false) в ином случае - он демонстрирует, как можно проверить строку в случае, если она в utf


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Кодировки и все смежное »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB