За последние 24 часа нас посетили 23758 программистов и 1604 робота. Сейчас ищут 818 программистов ...

preg_replace() ломает кодировку

Тема в разделе "PHP для новичков", создана пользователем SamyRed, 13 май 2016.

  1. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Здравствуйте. Почему после этой функции:
    Код (PHP):
    1. $sitemeta = preg_replace ("/[^а-яА-Яa-zA-Z0-9\ \,\[\]-\_\s]/", "", $sitemeta);
    строка "абвгдеёжзийклмнопрстуфхцчшщъыьэюя" заменяется на "абвгдеёжзийклмноп���������������я"?
     
  2. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    используй модификатор u, юникод.
     
    SamyRed нравится это.
  3. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Спасибо.
    --- Добавлено ---
    Ещё 1 вопрос, почему
    Код (PHP):
    1. $sitemeta = preg_replace ("/[^а-яa-z0-9\ ,-_\s]/iuxs", "", $sitemeta);
    не удаляет некоторые спец. символы? Например, ">", "<", "[", "]" и т.п.
     
  4. Basilio

    Basilio Случайный прохожий

    С нами с:
    6 апр 2016
    Сообщения:
    191
    Симпатии:
    54
    А почему он их должен удалять, если они у тебя не указаны в списке заменяемых символов?
     
  5. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    выражение должно удалять все символы кроме а-я, a-z, 0-9, тире, нижнее подчеркивание и пробельный символ?
    и что за '\ ,' между ними кстати пробел.
     
  6. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Совершенно верно.
    '\ ,' - экранированый пробел (модификатор 'x') и запятая
     
  7. Basilio

    Basilio Случайный прохожий

    С нами с:
    6 апр 2016
    Сообщения:
    191
    Симпатии:
    54
    Потому что в списке присутствует ",-_" что означает "все символы от , до _" - а сюда как раз попадают в том числе и [, <.
    --- Добавлено ---
    Если ты хочешь включить в список знак "-" именно как знак, а не как модификатор диапазона - то ставь его первым, иначе он всегда будет работать как модификатор диапазона.
     
  8. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Ааа, понял. Спасибо.
    --- Добавлено ---
    Можно же просто его экранировать.
     
  9. Basilio

    Basilio Случайный прохожий

    С нами с:
    6 апр 2016
    Сообщения:
    191
    Симпатии:
    54
    Это не всегда работает, зависит от реализации регэкспов. В некоторых версиях grep`а, например, он даже экранированный минус не понимает. Поэтому универсальная рекомендация - ставить его первым в списке.
     
  10. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
  11. Basilio

    Basilio Случайный прохожий

    С нами с:
    6 апр 2016
    Сообщения:
    191
    Симпатии:
    54
    Ну а вообще, на будущее, в борьбе с регэкспами очень помогает https://regex101.com/ - он особенно ценен тем, что он разбирает твой регэксп и довольно подробно расписывает, из чего он состоит и как работает.
     
  12. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Воу, классная штука. Спасибо. Возьму на вооружение.
     
  13. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    @Basilio у меня от этого волосы дыбом встают, когда вижу, сколько шагов делает регулярка для разбора простых вещей...
     
  14. Basilio

    Basilio Случайный прохожий

    С нами с:
    6 апр 2016
    Сообщения:
    191
    Симпатии:
    54
    Нууу... Да. А ты знаешь более эффективные способы решать те задачи, для которых применяются регулярки?
     
  15. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Наверное надо лучше знать регулярки и писать лучше чем я. Вот есть всякие "невозвратные" атомарные, я не шарю как их делать. :(