За последние 24 часа нас посетили 52135 программистов и 1763 робота. Сейчас ищут 979 программистов ...

Неразличимость одного от двух обратных слешей "\"

Тема в разделе "PHP для новичков", создана пользователем Александр101, 24 июн 2023.

  1. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    В этот раз вы чего-то недопонимаете.
    А вот версия с содержанием в абц неизвестного количества бэкслэшей мне понравилась.
    Надо обождать чего ТС скажет
     
  2. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Увы, да. При указанном условии - обойдётся одним проходом :oops:
    Пример, чтобы убедить в том, что str_replace() без внешнего цикла все замены выполняет за один "запуск" :)
     
  3. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Код (Text):
    1. 4
    2. si\mple\\\str\in\g
    Я всё ещё убежден, что проблема у ТС с объявлением переменной в $search, и требуется "минимизировать" разделитель.
     
  4. Александр101

    Александр101 Новичок

    С нами с:
    20 апр 2021
    Сообщения:
    29
    Симпатии:
    0
    Блин. Может я действительно что то путаю.
    echo str_replace('\\', '', '4\4'), '<br>';
    echo str_replace('\\', '', '4\\4');
    Слэши удаляются в обоих случаях.
     
  5. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.816
    Симпатии:
    1.332
    Адрес:
    Лень
    Я разве про файл говорил ?
     
  7. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Подтверждаю. Не говорил

    Записал
     
  8. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.816
    Симпатии:
    1.332
    Адрес:
    Лень
    Я вижу только одно в теме - попытка вдолбить в твою голову понимания работы "\" и то что ты слепо игнорируешь об его магической работы при различных апострофах с взаимодействиями некоторыми символами.
    --- Добавлено ---
    В первом случае слэш не удаляется, не заменяется функцией str_replace, а отрабатывает свое магическое свойство и исчезает до того как функция его заменит.

    Лови
    PHP:
    1. <?php
    2.  
    3. echo str_replace('\\', '', "4\n4"), '<br>';
    4. echo str_replace('\\', '', "4\\4");
    а в твоем - он не сопоставляется с последующим символом и преобразуется в обычный слэш, где str_replace благополучно переименовывает. А иначе сделай так:
    PHP:
    1. echo str_replace('\', '', '4\4'), '<br>';
    и ты получишь Parse error: syntax error, unexpected single-quoted string ", ", expecting ")"
    потому что обратный слэш сопоставим с одинарным апострофом и он его "экранировал"
    --- Добавлено ---
    И в вызубри это, каждую букву
     
    #33 MouseZver, 25 июн 2023
    Последнее редактирование: 25 июн 2023
  9. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Про '4\4' написано выше.
    Ещё напомню:
    В PHP обратный слеш - спец.символ, применяемый для экранирования некоторых других символов.
    Поэтому, чтобы в строке применить его как обычный символ - его надо экранировать.
     
    [vs] нравится это.
  10. Александр101

    Александр101 Новичок

    С нами с:
    20 апр 2021
    Сообщения:
    29
    Симпатии:
    0
    Вопрос решён.
    Проблема была вот в этой фразе в инструкции:
    Nowdoc - это то же самое для строк в одинарных кавычках, что и heredoc для строк в двойных кавычках.
    Я её помнил и почему то решил, что будет та же история, как при формированиии строки с двойными и одинарными кавычкам.
    И я даже проверять не стал. И зря поленился.
    В завершение.
    Если в строке необходимо различать двойной и одинарный обратный слэш, то при формировании строки необходимо использовать строго Nowdoc.
    Всем спасибо, всем добра.
     
  11. Александр101

    Александр101 Новичок

    С нами с:
    20 апр 2021
    Сообщения:
    29
    Симпатии:
    0
    Поторопился.
    Поскольку в Nowdoc передать строку нельзя, польза от него, для обработки строки, приходящей в переменную, нулевая.
    На этом идеи кончились, похоже проблема не имеет решения.
     
  12. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    ОК. Давайте зайдем с другой стороны.
    Код (Text):
    1. $str = 'something text';
    Опишите своими словами что происходит в коде выше
     
  13. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Вся эта заморочка с обратным слешем - исключительно, если в коде PHP его в строке пишете.
    Если, например, из файла читаете - то это простой обратный слеш.
     
  14. Александр101

    Александр101 Новичок

    С нами с:
    20 апр 2021
    Сообщения:
    29
    Симпатии:
    0
    Да всё глухо. Сама структура языка не позволяет этого сделать.
    '4\4' и '4\\4'
    Эти две записи различить невозможно, если только не поместить их в Nowdoc где всё воспринимается буквально.
    Но поскольку в Nowdoc можно поместит что то только вручную, смысла в этом уже нет.
    Есть ещё функция удаляющая экранирующие слэши, но она возвращает готовую строку, без информации где она эти слэши удалила.
    Слепое пятно РНР.
     
  15. Александр101

    Александр101 Новичок

    С нами с:
    20 апр 2021
    Сообщения:
    29
    Симпатии:
    0
    Можно попробовать какой-нибудь экзотический приём. Типа сначала к каждому слэшу добавить ещё один слэш и там где появятся два слэша резать. Если это сработает, а не будет тоже самое.
     
  16. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Эти две записи в PHP обозначают одно и тоже, одинарный слеш. Тебе это пытаются уже объяснить. Но так происходит только если строка задана через синтаксис PHP. Если нужно двойной обратный слеш, ставишь 4 слеша и радуешься. А внутри строки, полученной из файла, из базы, от пользователя, это уже не действует. Там пых сам по себе обратные слеши ни на что не заменяет. А данные обычно получаются от пользователя, всё-таки, никакой проблемы нету
    --- Добавлено ---
    Обратный слеш имеет особое значение во всех С-подобных языках
     
    [vs] нравится это.
  17. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Ух, надо чаще заходить! Обратный слеш - это экранирование. Чтобы он был прочитан как просто символ, его нужно экранировать. А чем? Ещё одним обратным слешем!
    Вы упускаете важную деталь - экранирование применяется только к специальным символам, то есть к символам, которые интерпретируется. В строке '4\4' обратный слеш не играет экранирующей роли, потому что нечего экранировать. В строке '4\\4' первый обратный слеш экранирует другого, поэтому "испаряется". В итоге:
    Код (Text):
    1. '4\\4' === '4\4'; // true
    Поэтому вы каждый раз что в $haysatack что в $search имели всего лишь одинарный слеш. Как видите, различать там нечего, эти строки равны до последнего бита. Разница только в сорце.
     
  18. Александр101

    Александр101 Новичок

    С нами с:
    20 апр 2021
    Сообщения:
    29
    Симпатии:
    0
    Я всё понял. Вообще как возникла задача. У меня __FILE__ выдаёт пути с обратными слэшами. Ну отсюда и пошло.