В этот раз вы чего-то недопонимаете. А вот версия с содержанием в абц неизвестного количества бэкслэшей мне понравилась. Надо обождать чего ТС скажет
Увы, да. При указанном условии - обойдётся одним проходом Пример, чтобы убедить в том, что str_replace() без внешнего цикла все замены выполняет за один "запуск"
Код (Text): 4 si\mple\\\str\in\g Я всё ещё убежден, что проблема у ТС с объявлением переменной в $search, и требуется "минимизировать" разделитель.
Блин. Может я действительно что то путаю. echo str_replace('\\', '', '4\4'), '<br>'; echo str_replace('\\', '', '4\\4'); Слэши удаляются в обоих случаях.
Я вижу только одно в теме - попытка вдолбить в твою голову понимания работы "\" и то что ты слепо игнорируешь об его магической работы при различных апострофах с взаимодействиями некоторыми символами. --- Добавлено --- В первом случае слэш не удаляется, не заменяется функцией str_replace, а отрабатывает свое магическое свойство и исчезает до того как функция его заменит. Лови PHP: <?php echo str_replace('\\', '', "4\n4"), '<br>'; echo str_replace('\\', '', "4\\4"); а в твоем - он не сопоставляется с последующим символом и преобразуется в обычный слэш, где str_replace благополучно переименовывает. А иначе сделай так: PHP: echo str_replace('\', '', '4\4'), '<br>'; и ты получишь Parse error: syntax error, unexpected single-quoted string ", ", expecting ")" потому что обратный слэш сопоставим с одинарным апострофом и он его "экранировал" --- Добавлено --- И в вызубри это, каждую букву
Про '4\4' написано выше. Ещё напомню: В PHP обратный слеш - спец.символ, применяемый для экранирования некоторых других символов. Поэтому, чтобы в строке применить его как обычный символ - его надо экранировать.
Вопрос решён. Проблема была вот в этой фразе в инструкции: Nowdoc - это то же самое для строк в одинарных кавычках, что и heredoc для строк в двойных кавычках. Я её помнил и почему то решил, что будет та же история, как при формированиии строки с двойными и одинарными кавычкам. И я даже проверять не стал. И зря поленился. В завершение. Если в строке необходимо различать двойной и одинарный обратный слэш, то при формировании строки необходимо использовать строго Nowdoc. Всем спасибо, всем добра.
Поторопился. Поскольку в Nowdoc передать строку нельзя, польза от него, для обработки строки, приходящей в переменную, нулевая. На этом идеи кончились, похоже проблема не имеет решения.
ОК. Давайте зайдем с другой стороны. Код (Text): $str = 'something text'; Опишите своими словами что происходит в коде выше
Вся эта заморочка с обратным слешем - исключительно, если в коде PHP его в строке пишете. Если, например, из файла читаете - то это простой обратный слеш.
Да всё глухо. Сама структура языка не позволяет этого сделать. '4\4' и '4\\4' Эти две записи различить невозможно, если только не поместить их в Nowdoc где всё воспринимается буквально. Но поскольку в Nowdoc можно поместит что то только вручную, смысла в этом уже нет. Есть ещё функция удаляющая экранирующие слэши, но она возвращает готовую строку, без информации где она эти слэши удалила. Слепое пятно РНР.
Можно попробовать какой-нибудь экзотический приём. Типа сначала к каждому слэшу добавить ещё один слэш и там где появятся два слэша резать. Если это сработает, а не будет тоже самое.
Эти две записи в PHP обозначают одно и тоже, одинарный слеш. Тебе это пытаются уже объяснить. Но так происходит только если строка задана через синтаксис PHP. Если нужно двойной обратный слеш, ставишь 4 слеша и радуешься. А внутри строки, полученной из файла, из базы, от пользователя, это уже не действует. Там пых сам по себе обратные слеши ни на что не заменяет. А данные обычно получаются от пользователя, всё-таки, никакой проблемы нету --- Добавлено --- Обратный слеш имеет особое значение во всех С-подобных языках
Ух, надо чаще заходить! Обратный слеш - это экранирование. Чтобы он был прочитан как просто символ, его нужно экранировать. А чем? Ещё одним обратным слешем! Вы упускаете важную деталь - экранирование применяется только к специальным символам, то есть к символам, которые интерпретируется. В строке '4\4' обратный слеш не играет экранирующей роли, потому что нечего экранировать. В строке '4\\4' первый обратный слеш экранирует другого, поэтому "испаряется". В итоге: Код (Text): '4\\4' === '4\4'; // true Поэтому вы каждый раз что в $haysatack что в $search имели всего лишь одинарный слеш. Как видите, различать там нечего, эти строки равны до последнего бита. Разница только в сорце.
Я всё понял. Вообще как возникла задача. У меня __FILE__ выдаёт пути с обратными слэшами. Ну отсюда и пошло.