Xpoint
   [напомнить пароль]

регулярные выражения

Метки: [без меток]
2011-06-22 10:21:04 [обр] lancer_89[досье]

Здравствуйте. У меня возникла проблема с регулярным выражением:))

preg_replace('/[^a-zа-я0-9]/i','',$_POST['proizv']);

Короче, мне необходимо обработать данные в $_POST['proizv'], т. е. оставить только буквы и цыфры.

В чем проблема:

Если передающееся значение на английском, то всё работает как надо, но если значение на русском, то функция возвращает строку часть которой состоит из русских символов и часть из непонятных символов(п�оизводи�ел� ).

Подскажите пожалуйста в чем проблема и как её можно исправить.

спустя 5 минут [обр] lancer_89[досье]
PHP Version 5.2.14
спустя 1 минуту [обр] lancer_89[досье]
PCRE Library Version 8.10 2010-06-25
спустя 3 часа 47 минут [обр] Maus(0/3)[досье]
возможно, у Вас что-то с локалями.
Кстати,а почему не
setlocale (LC_ALL, array ('ru_RU.CP1251', 'rus_RUS.1251'));
preg_replace('/[\W_]/','',$_POST['proizv']);
спустя 20 минут [обр] lancer_89[досье]
не помогло. всё также.
спустя 8 минут [обр] lancer_89[досье]
Разобрался!
Проблема не в локали, а в php. он умеет обрабатывать строки только в однобайтных кодировках. для utf8 есть костыль: http://php.rinet.ru/manual/en/ref.mbstring.php
спустя 4 минуты [обр] lancer_89[досье]
т.е. если UTF8, то можно использовать такой вариант
mb_ereg_replace('[^a-zа-я0-9]','',$_POST['proizv'])
спустя 3 минуты [обр] Jared(3/26)[досье]
Почему же костыль? Вполне себе нормальное решение как для php. Там разные функции для устаревших кодировок и юникода.
спустя 43 секунды [обр] lancer_89[досье]
PHP представляет строки просто как последовательность байт, оканчивающийся нулевым байтом (\0), также как и в C.
Поэтому заботиться о том, что символ может быть представлен более одним байтом (и переменным их числом, как в UTF-8), должен программист.
Для работы с multibyte character encodings есть библиотека mbstring (mb_*), действительно немного кастрированная.
спустя 36 секунд [обр] lancer_89[досье]
там не все функции.
спустя 2 минуты [обр] lancer_89[досье]
поэтому костыль)))
спустя 1 час 8 минут [обр] Maus(0/3)[досье]
Проблема не в локали, а в php. он умеет обрабатывать строки только в однобайтных кодировках

Стоит внимательнее читать мануал перед тем, как делать подобные заявления:
http://ru2.php.net/manual/en/reference.pcre.pattern.modifiers.php

К тому же PHP избавляется от поддержки POSIX-совместимых регулярок.

С UTF всё отлично работает:

setlocale (LC_ALL, 'ru_RU.utf8');
$_POST['proizv'] = "Если передающееся_значение на английском, то всё работает как надо, но если значение на русском, то функция возвращает строку часть которой состоит из русских символов и часть из непонятных символов(производитель)";

var_dump( preg_replace('/[\W_]/u','',$_POST['proizv']) ) ;
спустя 39 минут [обр] lancer_89[досье]
вообще Я как бэ и так пробовал, но у меня из всех символов оставались только цифры.
то что избавляется да, но у меня кроме меня самого никто php обновлять не будет.
спустя 14 минут [обр] lancer_89[досье]
все остальные были удалены.
Powered by POEM™ Engine Copyright © 2002-2005