Не экранируется обратная слэш

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

Статус темы:
Закрыта.
Модераторы: xpert13
  1. dump1111

    dump1111

    Регистр.:
    7 июл 2009
    Сообщения:
    266
    Симпатии:
    8
    Вот код:
    Код:
    <?php
    $content = 'the\?';
    echo preg_replace('|\\\?|si','',$content);
    ?>
    
    Код выводит the?
    а должен бы the
    Почему так? И как экранировать обратную слэш?
     
  2. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    363
    Симпатии:
    117
    PHP:
    $content 'the\?';
    echo 
    preg_replace('|\\\\\?|si','',$content);
     
  3. dump1111

    dump1111

    Регистр.:
    7 июл 2009
    Сообщения:
    266
    Симпатии:
    8
    Да, действительно начало работать. А почему именно 4 обратных слэши для экранирования одной?
     
  4. Dj_StelS

    Dj_StelS

    Регистр.:
    9 янв 2009
    Сообщения:
    349
    Симпатии:
    79
    потомучто что бы экранировать обратный слеш надо поставить перед ним еще один.
    то есть ты экранировал 1 слеш, а второй - нет.
     
  5. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    так он и спрашивает - почему для экранирования одного слэша понадобилось использовать аж четыре?
     
  6. Dj_StelS

    Dj_StelS

    Регистр.:
    9 янв 2009
    Сообщения:
    349
    Симпатии:
    79
    ты специально посты набираешь?
    Код смотри который ТС привел:
    он экранировал только один слеш, второй - нет.
     
  7. Sergeant13

    Sergeant13 Писатель

    Регистр.:
    17 фев 2009
    Сообщения:
    3
    Симпатии:
    0
    Сначала php определяет, какую строку передаем в функцию. При этом двойные слеши заменяются на одиночные. Если вместо двойного встречается одиночный, то он остается одиночным при условии, что после него нет символа, который требуется экранировать.
    После этого работает уже аппарат регулярных выражений, который по новой действует по указанной выше схеме. В итоге слеши, которые идут подряд, уменьшатся в 4 раза. А пятый слеш нужен для экранирования "?" в регулярном выражении.
     
  8. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    мне посты набирать уже давно без надобности. ТС экранировал один слэш и один знак вопроса, смотри внимательнее, ну нету там ДВУХ слэшей, там "экранирующий_слэш\экранирующий_слэш?", чтобы получить "\?". постом выше кстати уже все разжевано.
     
    Dj_StelS нравится это.
  9. dump1111

    dump1111

    Регистр.:
    7 июл 2009
    Сообщения:
    266
    Симпатии:
    8
    Ну это они заменяются только если слэши находятся в двойных кавычках, а в одинарных два слэша это так и есть два слэша. Ну вот ещё один пример:
    Код:
    <?php
    echo preg_replace('#\\\h#i','','ght\h');
    ?>
    
    Выводит ght
    Т.е. нужно как минимум три обратных слэши, чтобы экранировать одну. А зачем? Ведь по идее можно было написать echo preg_replace('#\h#i','','ght\h');
    и всё должно было работать, но не работает. Почему?
    Ведь само выражение \h не является специальным, h хоть в двойных, хоть в одинарных никак не интерпретируется, и врегулярных никак не интерпретируеся, тогда почему нужно три обратных слэши?
     
Статус темы:
Закрыта.