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
Форумы портала PHP.SU :: Версия для печати :: Количество бекслешей в строке PHP
Форумы портала PHP.SU » » Вопросы новичков » Количество бекслешей в строке PHP

Страниц (1): [1]
 

1. webmos - 15 Ноября, 2011 - 01:37:02 - перейти к сообщению
В документации сказано, что для вывода на экран обратного слеша необходимо его экранировать, то есть набрать \\. Действительно, в этом случае на экран выводится один обратный слеш.

Но и при наборе только одного \ происходит тоже самое. То есть строка: '\ ' выводит один слеш.
Получается, что одна такая черта распознается не как экранирующий символ, а как обычный?
Зачем тогда его экранировать? или это не корректный способ вывода этого символа?
2. Самогонщик - 15 Ноября, 2011 - 04:26:30 - перейти к сообщению
а ты \n попробуй Улыбка
(Добавление)
А если быть более серьёзными, то бакслеш превращает некоторые обычные символы, в необычные.
(Добавление)
PHP:
скопировать код в буфер обмена
  1. echo "\q\w\e\r\t\y\u\i\o\p\[\]\'\;\l\k\j\h\g\f\d\s\a\z\x\c\v\b\n\m\,\.\/"?>

Выполнение этого кода даёт весьма интересный результат.
3. webmos - 15 Ноября, 2011 - 14:09:10 - перейти к сообщению
Самогонщик пишет:
а ты \n попробуй Улыбка
(Добавление)
А если быть более серьёзными, то бакслеш превращает некоторые обычные символы, в необычные.
(Добавление)
PHP:
скопировать код в буфер обмена
  1. echo "\q\w\e\r\t\y\u\i\o\p\[\]\'\;\l\k\j\h\g\f\d\s\a\z\x\c\v\b\n\m\,\.\/"?>

Выполнение этого кода даёт весьма интересный результат.


Срабатывают управляющие символы. Вопрос то был в том, что одиночный backslash выводится на экран очень даже хорошо и без экранирования
4. LIME - 15 Ноября, 2011 - 14:14:47 - перейти к сообщению
webmos пишет:
очень даже хорошо и без экранирования
ты не понял
ведь в строке самогонщика не все символы заменяются так?
а в строке '\' бэкслеш идет перед пустым символом
тоесть сначала строка ограничивается кавычками а потом парсится
5. webmos - 15 Ноября, 2011 - 15:28:03 - перейти к сообщению
LIME пишет:
webmos пишет:
очень даже хорошо и без экранирования
ты не понял
ведь в строке самогонщика не все символы заменяются так?
а в строке '\' бэкслеш идет перед пустым символом
тоесть сначала строка ограничивается кавычками а потом парсится


в строке самогонщика не показываются только те символы, которые являются управляющими последовательностями (если я правильно понял).

в твоем примере за бекслешем идет одинарная кавычка (апостроф) и он ее экранирует так, что строка работать не будет.
но, если написать '\ ' (с пробелом), то и кавычки работают и бекслеш выводится на экран.
это я про то, что если за бекслешем стоит пробел, то машина его выводит и без экранирования.
6. Самогонщик - 15 Ноября, 2011 - 15:52:52 - перейти к сообщению
webmos пишет:

это я про то, что если за бекслешем стоит пробел, то машина его выводит и без экранирования.
Верно, бакслеш генерирует спецсимвол только если после него стоит символ из определённого набора.

А экранировать его необходимо, чтобы не словить вероятных ошибок. Можно не экранировать, если точно знаешь что делаешь, но, на мой взгляд, тотальное экранирование лучше применять - такая строка парсерится автоматом при первом же взгляде.
7. webmos - 15 Ноября, 2011 - 16:07:23 - перейти к сообщению
Самогонщик пишет:
webmos пишет:

это я про то, что если за бекслешем стоит пробел, то машина его выводит и без экранирования.
Верно, бакслеш генерирует спецсимвол только если после него стоит символ из определённого набора.

А экранировать его необходимо, чтобы не словить вероятных ошибок. Можно не экранировать, если точно знаешь что делаешь, но, на мой взгляд, тотальное экранирование лучше применять - такая строка парсерится автоматом при первом же взгляде.


Теперь понятно. Конечно, на всякий случай надежнее будет.
У меня в этой связи еще возникли вопросы насчет replacement в prog_replace.

1. По всему выходит, что replacement не является регулярным выражением, а является строкой, которую функция preg_replace обрабатывает по заданным разработчиками правилам (близким к правилам регулярок).

2. Как сказано в руководстве по PHP: обратные ссылки на подмаски указываются так \\n или $n. Например:\\1 и $1.

Во-первых ничего не сказано о том - в какие кавычки лучше заключать эту строку. (по-видимому можно и в одинарные и в двойные)

Во-вторых при заключении в одинарные кавычки у меня срабатывает и '\1' и '\\1'. И доллар кстати тоже срабатывает: 'S1'. Хотя, как сказано в разделе о строках: в случае одинарных кавычек переменные в строке не обрабатываются.
Почему тогда срабатывает доллар?
8. Самогонщик - 15 Ноября, 2011 - 16:42:08 - перейти к сообщению
Если строка заключена в двойные кавычки, то в ней заменяются переменные с $ в момент создания строки. Т.е. результирующая строка должна содержать $1, а как ты её получишь, не важно (если задаёшь в двойных кавачках, то обязательно надо экранировать). Для \\1 не знаю почему именно так написано, должен быть 1 слеш, который мы можем получить и так '\1' и так '\\1'.

Короче, в результирующей строке должно быть \1 или $1, а как ты получишь такую строку - это твои проблемы (с точки зрения функции preg_replace конечно же).


Код, который показывает почему лучше экранировать ;)
9. webmos - 15 Ноября, 2011 - 17:03:11 - перейти к сообщению
Самогонщик пишет:
...
Короче, в результирующей строке должно быть \1 или $1, а как ты получишь такую строку - это твои проблемы (с точки зрения функции preg_replace конечно же).


Код, который показывает почему лучше экранировать ;)


То есть сначала в момент создания строки доллары( с идущими за ними символами) сразу меняются на переменные (если совпадение имен есть. речь про двойные кавычки). Если переменной с таким именем, какой идет в виде символа после доллара нет, то проходит и без экранировки. А если есть, то начинаются ошибки и нужна экранировка. И уже после этого процесса начинает работать preg_replace.

В твоем примере вторая часть (после запятой) выводит, как есть. То есть, поскольку переменной с именем 3 нет, то $3 срабатывает как и нужно. А вот первая часть без экранировки не выводится.
Интересно, как машина понимает первую часть (до запятой)?

Правильно ли будет обобщить, что если одинарные кавычки, то достаточно: '\\1' (раз разработчики php настаивают, что для одинарного слеша и в одинарных кавычках его надо экранировать) или '$1'. Если двойные, то: "\\1" и "\$1" ?
10. Самогонщик - 15 Ноября, 2011 - 17:21:00 - перейти к сообщению
webmos пишет:
Правильно ли будет обобщить, что если одинарные кавычки, то достаточно: '\\1' (раз разработчики php настаивают, что для одинарного слеша и в одинарных кавычках его надо экранировать) или '$1'. Если двойные, то: "\\1" и "\$1" ?
Мои эксперименты показывают, что да.

webmos пишет:
раз разработчики php настаивают, что для одинарного слеша и в одинарных кавычках его надо экранировать
Пользуй как хочешь, но использование двойного слеша на автомате резко понижает шанс выстрелить себе в ногу.

Спойлер (Отобразить)
11. DeepVarvar - 15 Ноября, 2011 - 17:24:39 - перейти к сообщению
Я бы еще сказал так:
Пхп парсит строку по своим законам перед тем как передать её на вход регуляркопарсеру.
Поэтому для передачи двух обратных и еденицы может быть даже такое: "\\\\1".
12. webmos - 15 Ноября, 2011 - 17:28:47 - перейти к сообщению
DeepVarvar пишет:
Я бы еще сказал так:
Пхп парсит строку по своим законам перед тем как передать её на вход регуляркопарсеру.
Поэтому для передачи двух обратных и еденицы может быть даже такое: "\\\\1".


Выглядит так. Кстати в примере самогонщика :
Цитата:
echo "${1}1, $3";
, как мне думается, элемент ${1} машина считает за переменную (и не выводит - нет таковой переменной), а $3 за переменную не считает и выводит "как есть".

 

Powered by ExBB FM 1.0 RC1