Всем привет! Хочу уточнить, в РНР, при разборе строки, совершенно невозможно отличить одиночный обратный слэш от двух или есть какой то способ? Т. е "\" неотличим от "\\".
«При разборе строки» отличить очень легко: один значит один, два значит два. --- Добавлено --- А вот когда явно пишете в коде (внутри строки), просто обозначайте один двумя. Всегда. --- Добавлено --- И не забывайте, что иногда бывает нужно дважды экранировать, например сначала для пыха, потом для мускула. --- Добавлено --- Т.е. иногда бывает нужно написать четыре обратных слеша, чтобы в итоге получить один.
Это понятно. Но вот у Вас есть строка. И в ней встречаются одиночные и двойные обратные слеши. И неважно откуда она получена и по каким причинам ей надо обработать. К примеру, нужно получить ту часть строки которая идёт только после двойного обратного слэша. Как это сделать? Или это в принципе невозможно?
Без лишних слов. PHP: <?php $int = 13; $a = [ '\\', "\\", '\'', "\'", "\"", '\n', "\n(новая строка)", '\\\\', 'replace_\\_', '$int', "$int", "\$int" ]; $test_string = implode ( ' ', $a ); echo str_replace ( 'replace_\\_', "replace_{$int}_{\$int}_", $test_string ); PHP: \ \ ' \' " \n (новая строка) \\ replace_13_{$int}_ $int 13 $int --- Добавлено --- Так же обратный слэш используется в пространстве имен PHP: <?php namespace Php\Doc\Test; use My\Exception\FilterException; --- Добавлено --- В строковом: PHP: $string = \Php\Doc\Test :: class; // or $string = 'Php\\Doc\\Test'; $instance = new $string( $value );
Я Вам благодарен, что Вы потратили на меня время, но это не то. Вот строка 'абц\\абц\абц' где абц - неизвестный заранее текст неопределённой длины. Как из него удалить двойной слэш, не удаляя одиночный, или наоборот?
В документации написано: 'Если необходимо написать сам обратный слеш, продублируйте его (\\)' То есть, удалить из строки двойной обратный слеш просто: PHP: $foo = str_replace('\\\\', '', $subject);
PHP: <?php $string = <<<'STR' Php\\Doc\Test STR; // Удаляет одинарный слеш $str = '/(?<!\\\\)\\\\(?!\\\\)/ui'; echo preg_replace($str, '', $string) ; echo '<br>'; // Удаляет двойной слеш $str = '/\\\\{2}/ui'; echo preg_replace($str, '', $string)
Интересно, а есть практическая польза от решения этой задачи? Вот также любознательные дети отвлекают взрослых от решения важных задач...
Блин. Ребята, красавцы! Реально молодцы! Малейшая неточность в формулировке проблемы и готовое решение. Но это частный случай. Я имел ввиду общий случай, когда заранее неизвестно, сколько слешей двойных и одинарных и где они расположены.
Ошибаетесь. Пример в песочнице --- Добавлено --- str_replace сразу все вхождения заменяет. Параметр count по результату выполнения устанавливается равным количеству произведённых замен.
Пример не имеет смысла, в нём все слэши двойные. str_replace реагирует и на двойной и на одинарный слэш одинаково. Не мучайте его.
Один обратный слэш в php это еще не означает, что это символ. Он управляет, взаимодействует с другими специальными символами/буквами для форматирования по большей степени.
Если я правильно понял, задача - заменить любое количество идущих подряд символов на один. Если же неправильно, то попробуйте выразиться доступней
Это была бы элементарная задача. Если есть произвольная строка, в которой есть двойные и одинарные обратные слеши, то невозможно удалить только двойные или только одинарные. Вот и всё. Во всяком случае, я пока не могу найти такой способ. Может как то, через перекодировку, побайтно, с обратной перекодировкой после обработки.
Да приводил уже. Вот строка 'абц\\абц\абц' где абц - неизвестный заранее текст неопределённой длины, с неопределённым количеством слэшей таких и таких.
Код (Text): <?php //$str = "+{+{+\\\\\\\\\\\\\\\\Okkkkklk"; //$str = "\\\\\\\\\\\\\\\\\ \\\\\\\\\\\ "; $str = 'абц\\абц\абц'; $count = 1; while($count > 0) { $str = str_replace (chr(92).chr(92), chr(92), $str, $count); } echo $str; ?>
Ошибаетесь. Замените определение исходной строки. Получите её из файла, или из Nowdoc. К тому-же в примере var_dump есть. В его выводе ясно видно, сколько обратных слешей в строке содержится --- Добавлено --- Просто str_replace(). Только учтите, что в коде PHP для поиска двух обратных слешей, искомое значение надо формировать одним из способов: PHP: $search = <<<'END' \\ END; // или $search = '\\\\'; --- Добавлено --- именно абц содержит "неопределённое количество слешей таких и таких", или всё-таки слеши - разделители блоков текста "абц"? --- Добавлено --- Цикл по $cunt - ошибка. В общем случае str_replace может не произвести никаких замен, что приведёт к зацикливанию.