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. Ammiak - 07 Сентября, 2011 - 14:59:13 - перейти к сообщению
Всем привет, есть скрипт, который во введенной строке находит слова, читающиеся одинаково справа налево и слева направо (палиндромы). Скрипт выводит палиндром максимальной длины. Все работает, но с кодировкой проблема: не воспринимает строки, введенные на русском языке. Вот код:
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] в многобайтовых не работают, но как исправить код, не знаю...
2. LIME - 07 Сентября, 2011 - 15:35:03 - перейти к сообщению
$r пробовали выводить?
3. Ammiak - 07 Сентября, 2011 - 15:54:56 - перейти к сообщению
$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.  

Но здесь задача сложнее и я запутался...
4. Мелкий - 07 Сентября, 2011 - 16:14:11 - перейти к сообщению
Ammiak пишет:
Но здесь задача сложнее и я запутался...

Почему сложнее?
Сравниваете перевёрнутую строку с исходной - если они совпадают, значит то, то нам нужно.
5. LIME - 07 Сентября, 2011 - 16:14:31 - перейти к сообщению
Ammiak пишет:
если строка на русском-на выходе пустота
естественно интересовала $r при русской строке
видимо strrev не работает с утф
либо пишите свою фцию реверса
либо iconv
(Добавление)
я незнаю что быстрее получится
6. EuGen - 07 Сентября, 2011 - 16:29:38 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $str='ротатор';
  2. var_dump($str==(join('',array_reverse(preg_split('//u',$str, -1, PREG_SPLIT_NO_EMPTY)))));
7. LIME - 07 Сентября, 2011 - 16:35:19 - перейти к сообщению
там наверное = должно быть?
8. EuGen - 07 Сентября, 2011 - 16:37:29 - перейти к сообщению
Нет. Приведенный код покажет bool(true) если строка палинром и bool(false) в ином случае - он демонстрирует, как можно проверить строку в случае, если она в utf

 

Powered by ExBB FM 1.0 RC1