Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> stripos неправильно работает с кириллицей 
:(
    Опции темы
Serebrus
Дата 13.7.2009, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 333
Регистрация: 22.5.2007
Где: Ташкент

Репутация: нет
Всего: нет



Привет всем.
Задача такая: надо найти (и составить список в виде гиперссылок) htm файлов, где встречается вводимое слово (поиск по словам).
Вот код:
Код

function ScanDirect($dr, $wr)
{
 //$dr-имя директории (папка поиска)
 //$wr-искомое слово
 $url = $dr;
 if(is_dir($url)) 
 {
  $files=scandir($url);
  for($i=1; $i<=count($files); $i++)
  {
   if(!is_dir($files[$i-1]) && $files[$i-1]!='.' && $files[$i-1]!='..')
   {
    $a=explode('.', $files[$i-1]);
    if($a[1]=='htm')
    {     
     $fh = fopen($url.$files[$i-1], "r") or die("Can't open file!"); 
     $con = fread($fh, filesize($url.$files[$i-1]));     
     $c = iconv('windows-1251', 'utf-8', $con);
     $pos=stripos($c, $wr);
     if($pos!==false)
     {
      echo $files[$i-1]."</br>";
     } 
     fclose($fh);
    }
   }
  }  
 } 
}


Но, stripos не очень ладит с кириллицей (проверил, то находит в одном файле, то нет, т.е. находит не всех файлах и плюс находит то что вводится т.е. строго по регистру). 
PM MAIL   Вверх
Veve
Дата 13.7.2009, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 1.1.2005
Где: Латвия, Рига

Репутация: 3
Всего: 13



PM MAIL ICQ Skype MSN   Вверх
ksnk
Дата 13.7.2009, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Serebrus @  13.7.2009,  10:02 Найти цитируемый пост)
stripos не очень ладит с кириллицей 

imho, кто-то не очень ладит с локалью. В какой кодировке сами php файлы?

вот достаточно, для меня, универсальная установка локали
Код

setlocale(LC_ALL ,'ru_RU.CP1251');

После этой строчки все функции работы со строками начнут считать, что строки в кодировке cp1251 и правильно узнавать большие и маленькие буквы, не говоря уже о регулярках... таким образом, не нужно конвертировать их в utf-8...

Для проверки, насколько подошла локаль - можно сделать чего-то такое
Код

setlocale(LC_ALL ,'ru_RU.CP1251');
echo (strtoupper('Привет!'));

Если видны большие буквы, все, вроде, в порядке... Если нет - нужно ковырять настройки сервера и смотреть список поддерживаемых локалей...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Serebrus
Дата 13.7.2009, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 333
Регистрация: 22.5.2007
Где: Ташкент

Репутация: нет
Всего: нет



Veve, я употребил регистерно-независимый вариант (mb_stripos), но почемуто, все равно функция работает строго по регистеру, не понятно почему?

Добавлено @ 10:45
ksnk, кодировка страницы: utf-8. Я поставил setlocale(LC_ALL ,'ru_RU.CP1251') перед открытием файла, но не помагло, наоборот, mb_stripos вообще ни чего не находит, т.е. результат пуст.

Это сообщение отредактировал(а) Serebrus - 13.7.2009, 11:00
PM MAIL   Вверх
Ипатьев
Дата 13.7.2009, 10:59 (ссылка) |   (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



Во-первых, я бы задачу упростил.
Если у нас проблема с поиском строки в подстроке, то я бы и оставил в программе всего три строчки: присвоение значения переменной-стогу, переменной-иголке и собственно функцию поиска. 

Во-вторых, что значит "кодировка страницы: utf-8", если применяется конвертирование из 1251?
Сначала, я думаю, автору надо определиться, в какой кодировке у него какие данные, привести к единой, и потом только сравнивать.
PM MAIL   Вверх
ksnk
Дата 13.7.2009, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(Serebrus @  13.7.2009,  10:42 Найти цитируемый пост)
ksnk, кодировка страницы: utf-8 

Тогда, после установки локали и работы с файлами нужно будет вернуть ее назад.

А есть ли кодировка windows-1251 с точки зрения функции iconv? У меня везде написано CP1251...
Файлы  перекодируются в UTF-8 нормально?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Serebrus
Дата 13.7.2009, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 333
Регистрация: 22.5.2007
Где: Ташкент

Репутация: нет
Всего: нет



Ипатьев, "кодировка страницы: utf-8"-это, кодировка главной страницы, т.е. результаты поиска будут здесь, а вот windows-1251 это, кодировка htm страниц, которые осуществляется поиск.

Добавлено через 58 секунд
ksnk, да нормально
PM MAIL   Вверх
Ипатьев
Дата 13.7.2009, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 28
Всего: 37



кстати, имеет ли смысл с точки зрения производительности перекодировать каждый файл целиком, вместо того, чтобы сконвертировать одну переменную один раз?
хотя сначала, конечно, надо разобраться с тем, что там в какой кодировке и нужно ли перекодировать вообще. 
для начала надо уяснить, что в компьютере нет такого понятия "кирилица". есть понятие "кодировка".

Добавлено через 2 минуты и 50 секунд
echo mb_internal_encoding(); что выводит?

PM MAIL   Вверх
genixxx
Дата 11.11.2009, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 23.10.2009

Репутация: нет
Всего: нет



У меня похожая проблема - не работают функции stripos, strtoupper и т.п. с русскими буквами. Что я только не делал - и локаль прописывал в скрипте перед вызовом этих функций, и по SSH применял локаль на сервере, а толку ноль. Подскажите какое-нибудь магическое решение пожалуйста? =)

ksnk видимо единственный тут в теме, не могли бы Вы подсказать что делать, если такая локаль не подходит? (Прочем, как и еще штук пять которые я попробовал) Сайт на VDS, поэтому любые настройки могу сделать, но вот какие...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0685 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.