Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Количество бекслешей в строке PHP
Покинул форум
Сообщений всего: 65
Дата рег-ции: Окт. 2011 Откуда: Москва
Помог: 0 раз(а)
В документации сказано, что для вывода на экран обратного слеша необходимо его экранировать, то есть набрать \\. Действительно, в этом случае на экран выводится один обратный слеш.
Но и при наборе только одного \ происходит тоже самое. То есть строка: '\ ' выводит один слеш.
Получается, что одна такая черта распознается не как экранирующий символ, а как обычный?
Зачем тогда его экранировать? или это не корректный способ вывода этого символа?
Самогонщик
Отправлено: 15 Ноября, 2011 - 04:26:30
Посетитель
Покинул форум
Сообщений всего: 495
Дата рег-ции: Окт. 2011
Помог: 8 раз(а)
а ты \n попробуй (Добавление)
А если быть более серьёзными, то бакслеш превращает некоторые обычные символы, в необычные. (Добавление)
Выполнение этого кода даёт весьма интересный результат.
Срабатывают управляющие символы. Вопрос то был в том, что одиночный backslash выводится на экран очень даже хорошо и без экранирования
LIME
Отправлено: 15 Ноября, 2011 - 14:14:47
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
webmos пишет:
очень даже хорошо и без экранирования
ты не понял
ведь в строке самогонщика не все символы заменяются так?
а в строке '\' бэкслеш идет перед пустым символом
тоесть сначала строка ограничивается кавычками а потом парсится
webmos
Отправлено: 15 Ноября, 2011 - 15:28:03
Гость
Покинул форум
Сообщений всего: 65
Дата рег-ции: Окт. 2011 Откуда: Москва
Помог: 0 раз(а)
LIME пишет:
webmos пишет:
очень даже хорошо и без экранирования
ты не понял
ведь в строке самогонщика не все символы заменяются так?
а в строке '\' бэкслеш идет перед пустым символом
тоесть сначала строка ограничивается кавычками а потом парсится
в строке самогонщика не показываются только те символы, которые являются управляющими последовательностями (если я правильно понял).
в твоем примере за бекслешем идет одинарная кавычка (апостроф) и он ее экранирует так, что строка работать не будет.
но, если написать '\ ' (с пробелом), то и кавычки работают и бекслеш выводится на экран.
это я про то, что если за бекслешем стоит пробел, то машина его выводит и без экранирования.
Самогонщик
Отправлено: 15 Ноября, 2011 - 15:52:52
Посетитель
Покинул форум
Сообщений всего: 495
Дата рег-ции: Окт. 2011
Помог: 8 раз(а)
webmos пишет:
это я про то, что если за бекслешем стоит пробел, то машина его выводит и без экранирования.
Верно, бакслеш генерирует спецсимвол только если после него стоит символ из определённого набора.
А экранировать его необходимо, чтобы не словить вероятных ошибок. Можно не экранировать, если точно знаешь что делаешь, но, на мой взгляд, тотальное экранирование лучше применять - такая строка парсерится автоматом при первом же взгляде.
webmos
Отправлено: 15 Ноября, 2011 - 16:07:23
Гость
Покинул форум
Сообщений всего: 65
Дата рег-ции: Окт. 2011 Откуда: Москва
Помог: 0 раз(а)
Самогонщик пишет:
webmos пишет:
это я про то, что если за бекслешем стоит пробел, то машина его выводит и без экранирования.
Верно, бакслеш генерирует спецсимвол только если после него стоит символ из определённого набора.
А экранировать его необходимо, чтобы не словить вероятных ошибок. Можно не экранировать, если точно знаешь что делаешь, но, на мой взгляд, тотальное экранирование лучше применять - такая строка парсерится автоматом при первом же взгляде.
Теперь понятно. Конечно, на всякий случай надежнее будет.
У меня в этой связи еще возникли вопросы насчет replacement в prog_replace.
1. По всему выходит, что replacement не является регулярным выражением, а является строкой, которую функция preg_replace обрабатывает по заданным разработчиками правилам (близким к правилам регулярок).
2. Как сказано в руководстве по PHP: обратные ссылки на подмаски указываются так \\n или $n. Например:\\1 и $1.
Во-первых ничего не сказано о том - в какие кавычки лучше заключать эту строку. (по-видимому можно и в одинарные и в двойные)
Во-вторых при заключении в одинарные кавычки у меня срабатывает и '\1' и '\\1'. И доллар кстати тоже срабатывает: 'S1'. Хотя, как сказано в разделе о строках: в случае одинарных кавычек переменные в строке не обрабатываются.
Почему тогда срабатывает доллар?
Самогонщик
Отправлено: 15 Ноября, 2011 - 16:42:08
Посетитель
Покинул форум
Сообщений всего: 495
Дата рег-ции: Окт. 2011
Помог: 8 раз(а)
Если строка заключена в двойные кавычки, то в ней заменяются переменные с $ в момент создания строки. Т.е. результирующая строка должна содержать $1, а как ты её получишь, не важно (если задаёшь в двойных кавачках, то обязательно надо экранировать). Для \\1 не знаю почему именно так написано, должен быть 1 слеш, который мы можем получить и так '\1' и так '\\1'.
Короче, в результирующей строке должно быть \1 или $1, а как ты получишь такую строку - это твои проблемы (с точки зрения функции preg_replace конечно же).
Покинул форум
Сообщений всего: 65
Дата рег-ции: Окт. 2011 Откуда: Москва
Помог: 0 раз(а)
Самогонщик пишет:
...
Короче, в результирующей строке должно быть \1 или $1, а как ты получишь такую строку - это твои проблемы (с точки зрения функции preg_replace конечно же).
Код, который показывает почему лучше экранировать ;)
То есть сначала в момент создания строки доллары( с идущими за ними символами) сразу меняются на переменные (если совпадение имен есть. речь про двойные кавычки). Если переменной с таким именем, какой идет в виде символа после доллара нет, то проходит и без экранировки. А если есть, то начинаются ошибки и нужна экранировка. И уже после этого процесса начинает работать preg_replace.
В твоем примере вторая часть (после запятой) выводит, как есть. То есть, поскольку переменной с именем 3 нет, то $3 срабатывает как и нужно. А вот первая часть без экранировки не выводится.
Интересно, как машина понимает первую часть (до запятой)?
Правильно ли будет обобщить, что если одинарные кавычки, то достаточно: '\\1' (раз разработчики php настаивают, что для одинарного слеша и в одинарных кавычках его надо экранировать) или '$1'. Если двойные, то: "\\1" и "\$1" ?
Покинул форум
Сообщений всего: 495
Дата рег-ции: Окт. 2011
Помог: 8 раз(а)
webmos пишет:
Правильно ли будет обобщить, что если одинарные кавычки, то достаточно: '\\1' (раз разработчики php настаивают, что для одинарного слеша и в одинарных кавычках его надо экранировать) или '$1'. Если двойные, то: "\\1" и "\$1" ?
Мои эксперименты показывают, что да.
webmos пишет:
раз разработчики php настаивают, что для одинарного слеша и в одинарных кавычках его надо экранировать
Пользуй как хочешь, но использование двойного слеша на автомате резко понижает шанс выстрелить себе в ногу.
А может злобные разрабы пхп решили потом использовать все символы, которые сейчас не используются вместе со слешом для образования спецсимволов, что сломало бы имеющийся код.... я не знаю...
DeepVarvar
Отправлено: 15 Ноября, 2011 - 17:24:39
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
Я бы еще сказал так:
Пхп парсит строку по своим законам перед тем как передать её на вход регуляркопарсеру.
Поэтому для передачи двух обратных и еденицы может быть даже такое: "\\\\1".
Покинул форум
Сообщений всего: 65
Дата рег-ции: Окт. 2011 Откуда: Москва
Помог: 0 раз(а)
DeepVarvar пишет:
Я бы еще сказал так:
Пхп парсит строку по своим законам перед тем как передать её на вход регуляркопарсеру.
Поэтому для передачи двух обратных и еденицы может быть даже такое: "\\\\1".
Выглядит так. Кстати в примере самогонщика :
Цитата:
echo "${1}1, $3";
, как мне думается, элемент ${1} машина считает за переменную (и не выводит - нет таковой переменной), а $3 за переменную не считает и выводит "как есть".
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.