За последние 24 часа нас посетили 18675 программистов и 1922 робота. Сейчас ищут 933 программиста ...

Проблема с preg_replace() - удалить все кроме букв!

Тема в разделе "Регулярные выражения", создана пользователем fizichello, 4 ноя 2009.

  1. fizichello

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

    С нами с:
    18 июл 2009
    Сообщения:
    11
    Симпатии:
    0
    мне нужно чтобы из строки удалились все символы кроме букв. В результате preg_replace() удаляет и часть букв. может рег выражение составлено криво?
    HTML:
    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    2. <html xmlns="http://www.w3.org/1999/xhtml">
    3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    4. <title>Untitled Document</title>
    5. </head>
    6.  
    PHP:
    1. <?
    2. $z= "asd ^&* Иванов Иван Иванович%^&";
    3. $z = preg_replace ("/[^a-zA-ZА-Яа-я\s]/","",$z);
    4. echo $z;
    5. ?>
    HTML:
    1. </body>
    2. </html>
     
  2. fizichello

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

    С нами с:
    18 июл 2009
    Сообщения:
    11
    Симпатии:
    0
    точнее не удаляет, а заменяет их квадратиками...
     
  3. fizichello

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

    С нами с:
    18 июл 2009
    Сообщения:
    11
    Симпатии:
    0
    может в кодировке дело??
     
  4. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Наверняка в ней
     
  5. yuriy_el

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

    С нами с:
    21 янв 2011
    Сообщения:
    1
    Симпатии:
    0
    Адрес:
    http://newsocial.com.ua
    В таком случае:
    Код (Text):
    1. <?
    2.  $z= "asd ^&* Иванов Иван Иванович%^&";
    3.  $z = preg_replace ("/[^a-zа-я\s]/ui","",$z);
    4.  echo $z;
    5.  ?>
    где u- unicode, i - ignore casing
     
  6. Dima4321

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

    С нами с:
    1 апр 2009
    Сообщения:
    683
    Симпатии:
    0
    Лови ! локаль выставил. Также выставил возможность обратной связи по ошибкам.
    u --это модификатор жадности и к локали отношения не имеет.

    PHP:
    1. <?
    2. ini_set('display_errors',1);
    3.  error_reporting(E_ALL);
    4.  setlocale(LC_ALL, 'ru_RU.CP1251', 'rus_RUS.CP1251', 'Russian_Russia.1251');
    5.  $z= "asd ^&* Иванов Иван Иванович%^&";
    6.  $z = preg_replace ("/[^a-zа-я\s]/si","",$z);
    7.  echo $z;
    8.  ?>
     
  7. Апельсин

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

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    А давайте еще через год апнем тему.
     
  8. Dima4321

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

    С нами с:
    1 апр 2009
    Сообщения:
    683
    Симпатии:
    0
    Лично мой рекорд, я доходил аж до 2008 года ))
     
  9. Lotar

    Lotar Новичок

    С нами с:
    1 ноя 2014
    Сообщения:
    1
    Симпатии:
    0
    Тема в ТОП5 гугля ее НАДО апать ))


    хотел применить для защиты от инъекций через ГЕТ

    с ЮТФ8 получилась естественно каща
    ненавижу эту кодировку. она в теории Г.

    повозился с локалями понял, что это на долго и забил. Надо подключать МБ пакет. (( некогда
    оставил вот так
    $_GET["tag"]=' Агат+union+select+null,nu"ll/*' ;
    $z = preg_replace ("/[ (,+\'\"]/si","",$_GET["tag"]);
    print $z; exit;


    теоретически - это превратит иньекцию в бред. Скуль отдаст 0 строк и двигло выкинет на 404
     
  10. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    вы просто не понимаете назначения данной кодировки. есть ascii которая описывает 128 символов среди которых весь латинский алфавит, нумералы, знаки пунктуации и управляющие символы. остальные 128 символов дополняющие байт состоят из знаков, зависящих от кодовой таблицы. только для одной кириллицы их несколько штук среди которых самые популярные: cp1251 - виндовз вариант, cp866 - дос вариант, koi8r - русский вариат кода обмена информацией, koi8u - украинский вариант КОИ. гонять данные между этими кодировками - унылое Г.

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

    то что у вас получилась каша говорит только о том что у вас нет представления о том как кодируются те данные с которыми вы работаете. вот и всё. отличнейшая кодировка ю-ти-эф-восемь не виновата в том откуда у вас руки растут.

    допустим есть строка "бгд". я знаю что это строчные "б", "г" и "д". и юникод мне их правильно покажет. а если мы будем работать с однобайтной кодировкой?
    допустим исходных текст совпал в кодировке сипи1251 и кажет нам правильные "бгд"
    в дос (сипи866): "ЎЈ¤" - ну это надо перекодировать как-то.
    а в кои8р/кои8у - "ВЗД"! а это надо перекодировать? в исходном виде были бгд то есть произвольная последовательность строчных символов. ВЗД это такая же произвольная последовательность только прописных символов. вот ведь незадача. какая кодировка-то у нас если текст в кириллице но совершенно не имеет логического смысла и по словарю мы его хер найдем?..

    используйте юникод. не будьте Г. хороших выходных.
     
  11. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Для борьбы с инъекциями есть специально обученные функции.
     
  12. rognorog

    rognorog Новичок

    С нами с:
    7 июл 2014
    Сообщения:
    330
    Симпатии:
    0
    Какой нахер жадность.
    u - это валидность UTF-8.
    U - инвертирует жадность квантификаторов, и то по умолчанию они не жадные. Но становятся жадными, если за ними следует символ " ? ".
    А у него какраз проблема с unicod'ом, ну и с руками тоже ;) не в обиду.
     
  13. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    по умолчанию они как раз жадные. и не потому что после них ? стоит. и соответственно жадность выключает. U = Ungreen, не жадный.
     
  14. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Наплодили понимаешь идентификаторов
     
  15. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    интересно о чем я думал в этот момент... ungreedy конечно же...
     
  16. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а потому что в это время не надо ни о чем думать. Надо спаааать...