За последние 24 часа нас посетили 68025 программистов и 1648 роботов. Сейчас ищут 1058 программистов ...

preg_replace и буква Р

Тема в разделе "PHP для новичков", создана пользователем bkm, 1 апр 2013.

  1. bkm

    bkm Активный пользователь

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    сменил кодировку сайта на utf-8, заколебался каждый файл открывать, базу тоже сконвертировал, вроде все, можно пить пиво, но тут случилась засада, при чистке строки от гадости русскую букву Р (именно в верхнем регистре) корявит.
    например строка: Привет, Родина!
    в результате будет: Привет, [] одина!
    [] - это квадратик

    Код (PHP):
    1. $string = preg_replace("/[^-0-9а-яёА-ЯЁa-zA-Z.,!?:()№_ ]/iu", "", $string);
    в чем тут трабла? И почему именно Р ?
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а допиши её в регулярку да посмотри что будет. возможно ее нут между А и Я
    $string = preg_replace("/[^-0-9а-яёА-ЯРЁa-zA-Z.,!?:()№_ ]/iu", "", $string);
     
  3. bkm

    bkm Активный пользователь

    С нами с:
    22 окт 2009
    Сообщения:
    299
    Симпатии:
    0
    дописал, результат: п� ивет � одина

    Добавлено спустя 48 минут 45 секунд:
    забавно, если делать так

    Код (PHP):
    1. echo preg_replace("/[^-0-9а-яёА-ЯЁa-zA-Z.,!?:()№_ ]/iu", "", "пРивет Родина"); 
    то выводит как надо, а если так

    Код (PHP):
    1. echo filter_check_text($string="пРивет Родина", $atribut="title");
    2.  
    3. function filter_check_text($string, $atribut){
    4.  
    5. switch ($atribut){
    6.     case "phone"    :    $string = preg_replace("/[^-0-9(), ]/iu", "", $string); break;
    7.     case "text"     :    $string = preg_replace("/[^-0-9а-яёА-ЯЁa-zA-Z.,!?:()№=*+ ]/iu", "", $string); break;
    8.     case "title"    :    $string = preg_replace("/[^-0-9а-яёА-ЯЁa-zA-Z.,!?:()№_ ]/iu", "", $string); break;
    9.     case "login"    :    $string = preg_replace("/[^-0-9a-zA-Zа-яёА-ЯЁ_ ]/iu", "", $string); break;
    10.     case "name"     :    $string = preg_replace("/[^-а-яёА-ЯЁ]/iu", "", $string); break;
    11.     case "email"    :    $string = preg_replace("/[^-0-9a-zA-Z@_.]/iu", "", $string); break;
    12.     case "price"    :    $string = preg_replace("/[^0-9.]/iu", "", $string); break;
    13.     case "number"   :    $string = preg_replace("/[^0-9]/iu", "", $string); break;
    14.     case "key"      :    $string = preg_replace("/[^a-zA-Z]/iu", "", $string); break;
    15.     case "pass"     :    $string = preg_replace("/[^-0-9a-zA-Z.,!?:_@()=+]/iu", "", $string); break;
    16.     case "filename" :    $string = preg_replace("/[^-0-9a-z._]/iu", "", $string); break;
    17.     case ""         :    $string = preg_replace("/[^\w\x7F-\xFF\s]/", " ", $string);// удаляем все "ненормальные" символы
    18. }
    19.  
    20. $string = str_replace(chr(160), " ", $string); //Удаляем неразрывные пробелы
    21. $string = str_trim(preg_replace("/ +/", " ", $string)); //сжимаем двойные пробелы
    22.  
    23. return $string;
    24. } 
    то п� ивет � одина

    Добавлено спустя 9 минут 28 секунд:
    chr(160) - это для cp1251
    "\xC2\xA0" - это для utf8

    всем спасибо =)))
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    А че было-то?
     
  5. neverlose

    neverlose Активный пользователь

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    Надо эскейпить последовательности: preg_quote() в помощь, а та проблема что была, скорее всего решилась заменой chr(160) на последовательность юникода.
    Иными словами он заменял не тот байт на пробел.