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 :: Версия для печати :: eregi и русский язык
Форумы портала PHP.SU » PHP » Регулярные выражения » eregi и русский язык

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

1. Sirius - 20 Июня, 2010 - 09:19:27 - перейти к сообщению
Приветствую все.

Проблема в следующем:
функция eregi говорил что ООО Градэко и ООО ГРАДЭКО это разные строки. Судя по описанию функции регистр должен быть проигнорирован, но у меня получается иначе.

первое название берется из текстового файла, а второе как параметр от УРЛа. Если второй параметр пишу так же как и в файле указано, то всё нормально.

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2.     $b=0;
  3.     $Vfile = file("vali.ini");
  4.         $id=trim($_GET['id']);
  5.         foreach($Vfile as $item)
  6.         {
  7.         $parts = explode("::", $item);
  8.     if (eregi($id, $parts[0]))
  9.         {
  10.         $format = "%d/%m/%Y";
  11.         if (StrToTime($parts[1])>=StrToTime(now))
  12.         $b=1;
  13.         }
  14.  

Подскажите, где накасячил?
2. Champion - 20 Июня, 2010 - 10:04:49 - перейти к сообщению
Можно попробовать сделать setlocale(LC_ALL, 'ru_RU');
Другой вариант - заменить все русские буквы примерно вот так в шаблоне: ООО [Гг][Рр][аА][Дд][эЭ][кК][оО]. Преобразование строки Градэко в [Гг][Рр][аА][Дд][эЭ][кК][оО] можно автоматизировать, чтоб вручную весь файл не ковырять. Если такая замена действительно поможет, подскажу, как сделать такое преобразование.
Ну и третий вариант - дождаться, пока сюда зайдет JustUserR. Он тоже что-нибудь скажет хорошее.
3. Sirius - 20 Июня, 2010 - 10:53:46 - перейти к сообщению
Champion пишет:
Можно попробовать сделать setlocale(LC_ALL, 'ru_RU');

неа, не помогает....
Цитата:
Другой вариант - заменить все русские буквы примерно вот так в шаблоне: ООО [Гг][Рр][аА][Дд][эЭ][кК][оО]. Преобразование строки Градэко в [Гг][Рр][аА][Дд][эЭ][кК][оО] можно автоматизировать, чтоб вручную весь файл не ковырять. Если такая замена действительно поможет, подскажу, как сделать такое преобразование.

да я тоже уже задумывался над вариантом приравнивать все к единому регистру, но разобраться хочется.
Цитата:

Ну и третий вариант - дождаться, пока сюда зайдет JustUserR. Он тоже что-нибудь скажет хорошее.

О великий JustUserR! Взываю к тебе, снизойди к нам, услышь мои мольбы, помоги бестолковому Ламер Радость
4. EuGen - 20 Июня, 2010 - 11:10:47 - перейти к сообщению
http://forum.php.su/topic.php?fo...m=4&topic=21
- думаю, идея ясна
5. Sirius - 20 Июня, 2010 - 11:41:42 - перейти к сообщению
EuGen пишет:
http://forum.php.su/topic.php?fo...m=4&topic=21
- думаю, идея ясна


Идея-то ясна, я в поиске уже такое находил, прежде чем пост делать, но это не к месту. Всё в одной кодировке работает.
6. Champion - 20 Июня, 2010 - 11:51:59 - перейти к сообщению
Не, если бы строка была не в той кодировке, то не матчилась бы строка ни в каком регистре. А когда в одном матчится, в другом нет, то тут другая штука, по-моему.

Кстати, ereg* ведь выбрасывать будут, поэтому стоит перейти на preg_* функции. Может и проблема решится. У меня с ними таких проблем не возникало.
7. JustUserR - 20 Июня, 2010 - 13:33:40 - перейти к сообщению
Champion пишет:
Ну и третий вариант - дождаться, пока сюда зайдет JustUserR. Он тоже что-нибудь скажет хорошее.
Вообще если имеется проблема с кодировкой то регулярное выражение действительно не должно работать ни с нижним регистром ни с верхним - однако в зависмости от различных кодировок символы в нижнем регистре могут иметь разные ASCII-коды в то время как символы верхнего регистра могут совпадать
Однако может быть входная строка находится в кодировке UTF8 - в таком случае надо использовать функцию http://www.php.su/functions/?mb-eregi-replace а также дополнительно указать кодировку в http://www.php.su/functions/?mb-regex-encoding
8. Sirius - 20 Июня, 2010 - 13:59:13 - перейти к сообщению
нет, кодировка виндовская. я echo делал обоих строк при трассировке, всё в одинаковых кодировках. Наверно придется приводить всё к единому регистру и не мучаться Однако
(Добавление)
Сначала пробовал привести всё к верхнему регистру, на денвере локально всё работало, а у хостера так же нет, как и вышеуказанная функция. Давай уже мучить Яндекс, нашел:
@setlocale(LC_ALL, 'ru_RU.CP1251');
и всё заработало. Убрал приведение к верхнему регистру, оставил код как было указано в самом верху, и так же работает.

Всем спасибо!!!
9. JustUserR - 20 Июня, 2010 - 14:34:39 - перейти к сообщению
Sirius пишет:
Нет, кодировка виндовская. я echo делал обоих строк при трассировке, всё в одинаковых кодировках
Дело в том что кодировка входящих и выводимых PHP-скриптом данных а также строковых констант в исходном может совпадать и при диагностическом выводе на экран данные будут выглядеть как нужно - но если внутреннее представление данных в PHP-скрипте будет трактоваться в другой кодировке то строковые функции не будут работать как надо
Также несмотря на то что mb-функции предназначены для многобайтовых строк они также неплохо выполнять перекодировк и операции для однобайтовых кодировок - поэтому советую вам использовать две вышеуказанные функции и посмотреть что будет Также можно попробовать с помощью iconv или mb_convert_string сделать перевод в другую кодировку - и посмотреть как дела обстоят так
10. Champion - 20 Июня, 2010 - 14:53:30 - перейти к сообщению
Sirius пишет:
Давай уже мучить Яндекс, нашел:
@setlocale(LC_ALL, 'ru_RU.CP1251');
и всё заработало.
Вот многим с тебя пример взять надо.
11. JustUserR - 20 Июня, 2010 - 14:58:28 - перейти к сообщению
Champion пишет:
@setlocale(LC_ALL, 'ru_RU.CP1251');
и всё заработало
Собственно сказать предположение и было верное
Цитата:
Дело в том что кодировка входящих и выводимых PHP-скриптом данных а также строковых констант в исходном может совпадать и при диагностическом выводе на экран данные будут выглядеть как нужно - но если внутреннее представление данных в PHP-скрипте будет трактоваться в другой кодировке то строковые функции не будут работать как надо
- поэтому вариант с двойным iconv во внутренную кодировку представления данных в PHP-скрипте также должен работать аналогично
12. Sirius - 20 Июня, 2010 - 17:46:19 - перейти к сообщению
Champion пишет:
Sirius пишет:
Давай уже мучить Яндекс, нашел:
@setlocale(LC_ALL, 'ru_RU.CP1251');
и всё заработало.
Вот многим с тебя пример взять надо.


так я обычно сначала усердно Яндексю, потом гуглю, а уж потом людей мучаю на форумах. Так быстрее. Радость
13. JustUserR - 21 Июня, 2010 - 12:47:20 - перейти к сообщению
Sirius пишет:
Так я обычно сначала усердно Яндексю, потом гуглю, а уж потом людей мучаю на форумах. Так быстрее
Просто в таких случаях как в вашем с регистром в регулярных выражениях прослеживается казалось бы неочевидность - вроде бы все работает и кодировка на входе и выходе верная и даже шаблоны срабатывают а вот регистр нет Однако машина регулярных выражений может использовать собственную внутреннюю кодировку и переводить входные данные и строковые константы в нее - поэтому между собой они совпадают но к примеру шаблоны классов символов уже могут не совпадать
Именно по этой причине поллезно смотреть текущую внутреннюю кодировку с помощью функций http://www.php.su/functions/?mb-regex-encoding и http://www.php.su/functions/?mb-...nternal-encoding
14. Sirius - 21 Июня, 2010 - 13:58:47 - перейти к сообщению
Благодарю! Посмотрю описание.
15. JustUserR - 22 Июня, 2010 - 14:16:47 - перейти к сообщению
Sirius пишет:
Благодарю! Посмотрю описание.
На здоровье! Хотя данные функции принадлежат к разделу функция для обработки многобайтовых multiyte - они также хорошо работают с однобайтовыми строками при указании соответствующей кодировки в настроечной функции Но в отличие от обычных строковых функций они позволяют явно регулировать используемые кодироку - и не меняют общую локаль PHP-скрипта и трактовку сторковых констант в исходном PHP-коде

 

Powered by ExBB FM 1.0 RC1