UTF-8 и Регулярные выражения

Статус
В этой теме нельзя размещать новые ответы.

CrashX

В прошлом XSiteCMS
Регистрация
6 Июн 2008
Сообщения
682
Реакции
114
и так проблема проста как 3 копейки
вот рабочий пример для фильтрования всего кроме печатного все остальное отсекаю, это только для UTF для ASCII все намного проще
ЗЫ регулярные выражения типа а-я и a-z не расматриваю вовсе (объясняю почему да потому что мне нужно более 2 кодировок, а непечатные символы нужно удалять!)
PHP:
 function string($var) {
     $this->result[$var] = (string) preg_replace('
                                  /(?>[\x09\x0A\x0D\x20-\x7E]           # ASCII
                                           
                                  |[\xC2-\xDF]((?![\x80-\xBF])      # non-overlong 2-byte
                                  |[\x80-\xBF]{2,})
                                  |\xE0[\xA0-\xBF][\x80-\xBF]       # excluding overlongs
                                  |[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
                                  |\xED[\x80-\x9F][\x80-\xBF]       # excluding surrogates
                                  |\xF0[\x90-\xBF][\x80-\xBF]{2}    # planes 1-3
                                  |[\xF1-\xF3][\x80-\xBF]{3}         # planes 4-15
                                  |\xF4[\x80-\x8F][\x80-\xBF]{2}    # plane 16
                                 )*
                                /sx'
            ,'',$this->source[$var]);
// php 5.3
//$this->result[$var] = (string) filter_var($this->source[$var],FILTER_SANITIZE_STRING,FILTER_FLAG_STRIP_LOW);
  }
а теперь нужно подогнать еще несколько правил
не могу пока... нужно правило XML такое же что бы вырезало все кроме валидных данных, так же на чек маил

вот эти функции под ascii, мне бы теперь отсюда выразать все кроме нужного как тут расширить диапозон до последнего символа
PHP:
function number($var) {
    $this->result[$var] = (int) preg_replace('#[\x0-\x2F\x3A-\xFF]#','',$this->source[$var]);
//$this->result[$var] = (int) filter_var($this->source[$var],FILTER_SANITIZE_NUMBER_INT);
  }
  function email($var) {
    $this->result[$var] = (string) preg_replace('#[\x0-\x2C\x2F\x3A-\x3F\x5B-\x60\x7B-\xFF]#','',$this->source[$var]);
//$this->result[$var] = (string) filter_var($this->source[$var],FILTER_SANITIZE_EMAIL);
  }

Добавлено через 2 минуты
тест
первой функции
Код:
Array
(
    [ulogin] => ыфв
    [upassword] => ыя↓৾☺ƹƸЪв(*№Ю☼ᘌ
    [upassword_repeated] => ыя↓৾☺ƹƸЪв(*№Ю☼ᘌ
    [uemail] => qwe@qwee.we
    [uname] => ыя↓৾☺ƹƸЪв(*№Ю☼ᘌ
    [usurname] => qweqwe
    [captcha] => 170231
)

Array
(
    [id] => 
    [gid] => 
    [ulogin] => ыфв
    [upassword] => ыяƹƸЪвЮ
    [uemail] => qwe@qwee.we
    [unick] => 
    [uname] => ыяƹƸЪвЮ
    [usurname] => 
    [ulocation] => 
    [ulanguage] => 
    [utemplate] => 
    [uregister] => 2010-05-19 07:51:59
    [uvisit] => 2010-05-19 07:51:59
 
помогите перевести выражение для preg_replase

PHP:
preg_match_all('/
(?> \r\n   # переносы строк
| &(?> [a-zA-Z][a-zA-Z\d]+| \#(?> \d{1,4}| x[\da-fA-F]{2,4}));  # html сущности (< > & ")
| [\x09\x0A\x0D\x20-\x7E]           # ASCII
| [\xC2-\xDF][\x80-\xBF]            # non-overlong 2-byte
|  \xE0[\xA0-\xBF][\x80-\xBF]       # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
|  \xED[\x80-\x9F][\x80-\xBF]       # excluding surrogates
|  \xF0[\x90-\xBF][\x80-\xBF]{2}    # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3}         # planes 4-15
|  \xF4[\x80-\x8F][\x80-\xBF]{2}    # plane 16
)
/sx', $s, $m);
 
кто как чистит код регулярками вообще?
для utf соответственно

Добавлено через 30 минут
пошел по пути наименьшего сопротивления
$this->result[$var] = (string) preg_replace('/[^\w\pL_-]/ui','',$this->source[$var]);
все символы всех алфавитов есть)

результат

DO
Array
(
[ulogin] => qwe)ࡓ##(#* N#)ٶ√♀]qwe123
[upassword] => qwe)ࡓ##(#* N#)ٶ√♀]qwe123
[upassword_repeated] => qwe)ࡓ##(#* N#)ٶ√♀]qwe123
[uemail] => sdf@sddsf.ru
[uname] => asdsadasd
[usurname] => asddas
[captcha] => 917837
)
PO
Array
(
[ulogin] => qweNٶqwe123
[upassword] => qweNٶqwe123
[upassword_repeated] => qweNٶqwe123
[uemail] => sdf@sddsf.ru
[uname] => asdsadasd
[usurname] => asddas
[captcha] => 917837
)
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху