За последние 24 часа нас посетили 37966 программистов и 7865 роботов. Сейчас ищут 1718 программистов ...

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

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

  1. Александр101

    Александр101 Активный пользователь

    С нами с:
    20 апр 2021
    Сообщения:
    30
    Симпатии:
    0
    Всем привет!
    Хочу уточнить, в РНР, при разборе строки, совершенно невозможно отличить одиночный обратный слэш от двух или есть какой то способ?
    Т. е "\" неотличим от "\\".
     
  2. Drunkenmunky

    Drunkenmunky Старожил

    С нами с:
    12 авг 2020
    Сообщения:
    1.511
    Симпатии:
    284
  3. Александр101

    Александр101 Активный пользователь

    С нами с:
    20 апр 2021
    Сообщения:
    30
    Симпатии:
    0
  4. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    656
    «При разборе строки» отличить очень легко: один значит один, два значит два.
    --- Добавлено ---
    А вот когда явно пишете в коде (внутри строки), просто обозначайте один двумя. Всегда.
    --- Добавлено ---
    И не забывайте, что иногда бывает нужно дважды экранировать, например сначала для пыха, потом для мускула.
    --- Добавлено ---
    Т.е. иногда бывает нужно написать четыре обратных слеша, чтобы в итоге получить один.
     
    Sail нравится это.
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    656
    Кроме nowdoc. Но подобной хренью (heredoc/nowdoc) пользуются редко или вообще не пользуются.
     
  6. Александр101

    Александр101 Активный пользователь

    С нами с:
    20 апр 2021
    Сообщения:
    30
    Симпатии:
    0
    Это понятно.
    Но вот у Вас есть строка. И в ней встречаются одиночные и двойные обратные слеши. И неважно откуда она получена и по каким причинам ей надо обработать.
    К примеру, нужно получить ту часть строки которая идёт только после двойного обратного слэша. Как это сделать? Или это в принципе невозможно?
     
  7. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.840
    Симпатии:
    1.338
    Адрес:
    Лень
    Без лишних слов.


    PHP:
    1. <?php
    2.  
    3. $int = 13;
    4.  
    5. $a = [ '\\', "\\", '\'', "\'", "\"", '\n', "\n(новая строка)", '\\\\', 'replace_\\_', '$int', "$int", "\$int" ];
    6.  
    7. $test_string = implode ( ' ', $a );
    8.  
    9. echo str_replace ( 'replace_\\_', "replace_{$int}_{\$int}_", $test_string );

    PHP:
    1. \ \ ' \' " \n
    2. (новая строка) \\ replace_13_{$int}_ $int 13 $int
    --- Добавлено ---
    Так же обратный слэш используется в пространстве имен
    PHP:
    1. <?php
    2.  
    3. namespace Php\Doc\Test;
    4.  
    5. use My\Exception\FilterException;
    --- Добавлено ---
    В строковом:
    PHP:
    1. $string = \Php\Doc\Test :: class;
    2.  
    3. // or
    4.  
    5. $string = 'Php\\Doc\\Test';
    6.  
    7. $instance = new $string( $value );
     
  8. Александр101

    Александр101 Активный пользователь

    С нами с:
    20 апр 2021
    Сообщения:
    30
    Симпатии:
    0
    Я Вам благодарен, что Вы потратили на меня время, но это не то.

    Вот строка 'абц\\абц\абц'
    где абц - неизвестный заранее текст неопределённой длины.

    Как из него удалить двойной слэш, не удаляя одиночный, или наоборот?
     
  9. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    В документации написано: 'Если необходимо написать сам обратный слеш, продублируйте его (\\)'
    То есть, удалить из строки двойной обратный слеш просто:
    PHP:
    1. $foo = str_replace('\\\\', '', $subject);
     
  10. Александр101

    Александр101 Активный пользователь

    С нами с:
    20 апр 2021
    Сообщения:
    30
    Симпатии:
    0
    Да. Удалится. Но удалится и двойной и одиночный. В этом и проблема.
     
  11. Aleksandr.B

    Aleksandr.B Активный пользователь

    С нами с:
    2 фев 2023
    Сообщения:
    159
    Симпатии:
    41
    Адрес:
    Барнаул
    PHP:
    1. <?php
    2.  
    3. $string = <<<'STR'
    4. Php\\Doc\Test
    5. STR;
    6.  
    7. // Удаляет одинарный слеш
    8. $str = '/(?<!\\\\)\\\\(?!\\\\)/ui';
    9. echo preg_replace($str, '', $string) ;
    10.  
    11. echo '<br>';
    12.  
    13. // Удаляет двойной слеш
    14. $str = '/\\\\{2}/ui';
    15. echo preg_replace($str, '', $string)
     
  12. antoniii

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

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Интересно, а есть практическая польза от решения этой задачи?
    Вот также любознательные дети отвлекают взрослых от решения важных задач... :)
     
    #12 antoniii, 24 июн 2023
    Последнее редактирование: 24 июн 2023
  13. Александр101

    Александр101 Активный пользователь

    С нами с:
    20 апр 2021
    Сообщения:
    30
    Симпатии:
    0
    Блин. Ребята, красавцы! Реально молодцы! Малейшая неточность в формулировке проблемы и готовое решение. Но это частный случай.
    Я имел ввиду общий случай, когда заранее неизвестно, сколько слешей двойных и одинарных и где они расположены.
     
  14. Drunkenmunky

    Drunkenmunky Старожил

    С нами с:
    12 авг 2020
    Сообщения:
    1.511
    Симпатии:
    284
    str_replace() в цикле. До 0 в параметре count
     
  15. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Ошибаетесь.
    Пример в песочнице
    --- Добавлено ---
    str_replace сразу все вхождения заменяет.
    Параметр count по результату выполнения устанавливается равным количеству произведённых замен.
     
  16. Drunkenmunky

    Drunkenmunky Старожил

    С нами с:
    12 авг 2020
    Сообщения:
    1.511
    Симпатии:
    284
    Именно. Двойной заменяем на одинарный.
    Вы уловили суть
     
  17. Александр101

    Александр101 Активный пользователь

    С нами с:
    20 апр 2021
    Сообщения:
    30
    Симпатии:
    0
    Пример не имеет смысла, в нём все слэши двойные. str_replace реагирует и на двойной и на одинарный слэш одинаково. Не мучайте его.
     
  18. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.840
    Симпатии:
    1.338
    Адрес:
    Лень
    Один обратный слэш в php это еще не означает, что это символ. Он управляет, взаимодействует с другими специальными символами/буквами для форматирования по большей степени.
     
  19. Drunkenmunky

    Drunkenmunky Старожил

    С нами с:
    12 авг 2020
    Сообщения:
    1.511
    Симпатии:
    284
    Если я правильно понял, задача - заменить любое количество идущих подряд символов на один.
    Если же неправильно, то попробуйте выразиться доступней
     
  20. Drunkenmunky

    Drunkenmunky Старожил

    С нами с:
    12 авг 2020
    Сообщения:
    1.511
    Симпатии:
    284
    Если оно считано из файла, например, то бэкслэш это просто бэкслэш.
     
  21. Александр101

    Александр101 Активный пользователь

    С нами с:
    20 апр 2021
    Сообщения:
    30
    Симпатии:
    0
    Это была бы элементарная задача.
    Если есть произвольная строка, в которой есть двойные и одинарные обратные слеши, то невозможно удалить только двойные или только одинарные. Вот и всё. Во всяком случае, я пока не могу найти такой способ. Может как то, через перекодировку, побайтно, с обратной перекодировкой после обработки.
     
  22. Drunkenmunky

    Drunkenmunky Старожил

    С нами с:
    12 авг 2020
    Сообщения:
    1.511
    Симпатии:
    284
    Пример такой строки, пожалуйста.
    И что должно остаться в итоге.
     
  23. Александр101

    Александр101 Активный пользователь

    С нами с:
    20 апр 2021
    Сообщения:
    30
    Симпатии:
    0
    Да приводил уже.
    Вот строка 'абц\\абц\абц'
    где абц - неизвестный заранее текст неопределённой длины, с неопределённым количеством слэшей таких и таких.
     
  24. Drunkenmunky

    Drunkenmunky Старожил

    С нами с:
    12 авг 2020
    Сообщения:
    1.511
    Симпатии:
    284
    Код (Text):
    1. <?php
    2. //$str = "+{+{+\\\\\\\\\\\\\\\\Okkkkklk";
    3. //$str = "\\\\\\\\\\\\\\\\\ \\\\\\\\\\\ ";
    4. $str = 'абц\\абц\абц';
    5. $count = 1;
    6.  
    7. while($count > 0)
    8. {
    9.     $str = str_replace (chr(92).chr(92), chr(92), $str, $count);
    10. }
    11. echo $str;
    12. ?>
     
  25. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Ошибаетесь.
    Замените определение исходной строки. Получите её из файла, или из Nowdoc.
    К тому-же в примере var_dump есть. В его выводе ясно видно, сколько обратных слешей в строке содержится :cool:
    --- Добавлено ---
    Просто str_replace().
    Только учтите, что в коде PHP для поиска двух обратных слешей, искомое значение надо формировать одним из способов:
    PHP:
    1. $search = <<<'END'
    2. \\
    3. END;
    4. // или
    5. $search = '\\\\';
    --- Добавлено ---
    именно абц содержит "неопределённое количество слешей таких и таких", или всё-таки слеши - разделители блоков текста "абц"?
    --- Добавлено ---
    Цикл по $cunt - ошибка. В общем случае str_replace может не произвести никаких замен, что приведёт к зацикливанию.