Согласно всему что я читал в интернете экранировать обратный слеш нужно простым дублированием обратного слеша, но у меня но при написании PCRE выражения:
"/\\/"
браузер выдает ошибку что не найден конечный разделитель, а при
"/\\\/"
все нормально.
В чем может быть причина?
php версии 5.3.3
Спустя 15 минут, 27 секунд (28.07.2011 - 21:00) Winston написал(а):
Все правильно, а ты разберись
"/\\/"
Предпоследний слеш экранирует последний, а второй остается не экранированным
А чтобы не было такого геммора пиши так
"#здесь_шаблон#" и можешь не экранировать слеши
"/\\/"
Предпоследний слеш экранирует последний, а второй остается не экранированным
А чтобы не было такого геммора пиши так
"#здесь_шаблон#" и можешь не экранировать слеши
Спустя 16 минут, 54 секунды (28.07.2011 - 21:17) Invis1ble написал(а):
SAYLOR
это называется "синдром зубочисток"
PHPprogrammer
В данном случае смена delimiter'а не решает проблему
это называется "синдром зубочисток"
PHPprogrammer
В данном случае смена delimiter'а не решает проблему
Спустя 5 минут, 28 секунд (28.07.2011 - 21:22) neadekvat написал(а):
Цитата (PHPprogrammer @ 28.07.2011 - 22:00) |
Все правильно, а ты разберись "/\\/" Предпоследний слеш экранирует последний, а второй остается не экранированным |
Читать справа налево - конечно же все правильно.
Цитата (Invis1ble @ 28.07.2011 - 22:17) |
В данном случае смена delimiter'а не решает проблему |
Смена названных символов избавляет от необходимости экранировать /, что очень помогает, когда в регулярке есть теги.
Спустя 21 минута, 49 секунд (28.07.2011 - 21:44) SAYLOR написал(а):
экранировать / я и не собирался, и по идее например такой код
preg_match_all("/\\/",$strang,$arr,PREG_OFFSET_CAPTURE);
должен работать, ведь \\ не должен распространяется на разделители, а просто экранировать обратный слеш.
preg_match_all("/\\/",$strang,$arr,PREG_OFFSET_CAPTURE);
должен работать, ведь \\ не должен распространяется на разделители, а просто экранировать обратный слеш.
Цитата |
В данном случае смена delimiter'а не решает проблему |
Да дельствительно, проблема в том что php пару символов \\ воспринимает как один \ и вместо экранирования обратного слеша экранирует следующий символ( в моем случае разделитель)
Читать справа налево - как именно, как если бы символы были в обратном порядке?
Спустя 6 минут, 58 секунд (28.07.2011 - 21:51) neadekvat написал(а):
"/\\/"
Что за это регулярка вообще? оО
Что-то мне подсказывает, что задача решается с помощью строковых функций.
Что за это регулярка вообще? оО
Что-то мне подсказывает, что задача решается с помощью строковых функций.
Спустя 2 минуты, 11 секунд (28.07.2011 - 21:53) alex12060 написал(а):
попробуй с preg_quote() поиграться.
Спустя 7 минут (28.07.2011 - 22:00) SAYLOR написал(а):
Регулярка практической ценности не представляет никакой, но смысл не в ней а в том почему символ \ нормально не экранируется, ведь может возникнуть ситуация когда в выражении нужно будет добавить поиск обратного слеша, и написав \\ результат будет не ожиданный
Спустя 2 минуты, 38 секунд (28.07.2011 - 22:03) Winston написал(а):
SAYLOR
Вам поможет preg_quote()
Вам поможет preg_quote()
preg_match_all(preg_quote("/\\/"),$strang,$arr,PREG_OFFSET_CAPTURE);
Спустя 20 минут, 6 секунд (28.07.2011 - 22:23) SAYLOR написал(а):
да помогло))) всем спасибо
Спустя 4 минуты, 30 секунд (28.07.2011 - 22:28) SAYLOR написал(а):
И я похоже понял почему ошибка возникала.
Видимо php интерпретатор встречая строку автоматически экранирует управляющие последовательности и возвращает один символ, а потом что получилось передает в функцию
Видимо php интерпретатор встречая строку автоматически экранирует управляющие последовательности и возвращает один символ, а потом что получилось передает в функцию
Спустя 3 минуты, 51 секунда (28.07.2011 - 22:31) Winston написал(а):
Цитата (SAYLOR @ 28.07.2011 - 22:28) |
Видимо php интерпретатор встречая строку автоматически экранирует |
Никак нет. Если бы такое и было, то ф-и для экранирования и подобного, просто были бы лишние.
Спустя 7 минут, 58 секунд (28.07.2011 - 22:39) SAYLOR написал(а):
я имел ввиду что если интерпретатор встречает в строке экранированную последовательность например \ / то он заменяет ее на один символ /, и в дальнейшем в функцию передается только 1 символ
Спустя 2 минуты, 41 секунда (28.07.2011 - 22:42) Winston написал(а):
Цитата (SAYLOR @ 28.07.2011 - 22:39) |
я имел ввиду что если интерпретатор встречает в строке экранированную последовательность например \ / то он заменяет ее на один символ /, и в дальнейшем в функцию передается только 1 символ |
Это да