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

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Возник вопрос по поводу документации php.
webmos
Отправлено: 15 Ноября, 2011 - 01:37:02
Post Id



Гость


Покинул форум
Сообщений всего: 65
Дата рег-ции: Окт. 2011  
Откуда: Москва


Помог: 0 раз(а)




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

Но и при наборе только одного \ происходит тоже самое. То есть строка: '\ ' выводит один слеш.
Получается, что одна такая черта распознается не как экранирующий символ, а как обычный?
Зачем тогда его экранировать? или это не корректный способ вывода этого символа?
 
 Top
Самогонщик
Отправлено: 15 Ноября, 2011 - 04:26:30
Post Id



Посетитель


Покинул форум
Сообщений всего: 495
Дата рег-ции: Окт. 2011  


Помог: 8 раз(а)




а ты \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\,\.\/"?>

Выполнение этого кода даёт весьма интересный результат.
 
 Top
webmos
Отправлено: 15 Ноября, 2011 - 14:09:10
Post Id



Гость


Покинул форум
Сообщений всего: 65
Дата рег-ции: Окт. 2011  
Откуда: Москва


Помог: 0 раз(а)




Самогонщик пишет:
а ты \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 выводится на экран очень даже хорошо и без экранирования
 
 Top
LIME
Отправлено: 15 Ноября, 2011 - 14:14:47
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




webmos пишет:
очень даже хорошо и без экранирования
ты не понял
ведь в строке самогонщика не все символы заменяются так?
а в строке '\' бэкслеш идет перед пустым символом
тоесть сначала строка ограничивается кавычками а потом парсится
 
 Top
webmos
Отправлено: 15 Ноября, 2011 - 15:28:03
Post Id



Гость


Покинул форум
Сообщений всего: 65
Дата рег-ции: Окт. 2011  
Откуда: Москва


Помог: 0 раз(а)




LIME пишет:
webmos пишет:
очень даже хорошо и без экранирования
ты не понял
ведь в строке самогонщика не все символы заменяются так?
а в строке '\' бэкслеш идет перед пустым символом
тоесть сначала строка ограничивается кавычками а потом парсится


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

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



Посетитель


Покинул форум
Сообщений всего: 495
Дата рег-ции: Окт. 2011  


Помог: 8 раз(а)




webmos пишет:

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

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



Гость


Покинул форум
Сообщений всего: 65
Дата рег-ции: Окт. 2011  
Откуда: Москва


Помог: 0 раз(а)




Самогонщик пишет:
webmos пишет:

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

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


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

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

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

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

Во-вторых при заключении в одинарные кавычки у меня срабатывает и '\1' и '\\1'. И доллар кстати тоже срабатывает: 'S1'. Хотя, как сказано в разделе о строках: в случае одинарных кавычек переменные в строке не обрабатываются.
Почему тогда срабатывает доллар?
 
 Top
Самогонщик
Отправлено: 15 Ноября, 2011 - 16:42:08
Post Id



Посетитель


Покинул форум
Сообщений всего: 495
Дата рег-ции: Окт. 2011  


Помог: 8 раз(а)




Если строка заключена в двойные кавычки, то в ней заменяются переменные с $ в момент создания строки. Т.е. результирующая строка должна содержать $1, а как ты её получишь, не важно (если задаёшь в двойных кавачках, то обязательно надо экранировать). Для \\1 не знаю почему именно так написано, должен быть 1 слеш, который мы можем получить и так '\1' и так '\\1'.

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


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

(Отредактировано автором: 15 Ноября, 2011 - 16:43:02)

 
 Top
webmos
Отправлено: 15 Ноября, 2011 - 17:03:11
Post Id



Гость


Покинул форум
Сообщений всего: 65
Дата рег-ции: Окт. 2011  
Откуда: Москва


Помог: 0 раз(а)




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


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


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

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

Правильно ли будет обобщить, что если одинарные кавычки, то достаточно: '\\1' (раз разработчики php настаивают, что для одинарного слеша и в одинарных кавычках его надо экранировать) или '$1'. Если двойные, то: "\\1" и "\$1" ?

(Отредактировано автором: 15 Ноября, 2011 - 17:06:21)

 
 Top
Самогонщик
Отправлено: 15 Ноября, 2011 - 17:21:00
Post Id



Посетитель


Покинул форум
Сообщений всего: 495
Дата рег-ции: Окт. 2011  


Помог: 8 раз(а)




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

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

Спойлер (Отобразить)
 
 Top
DeepVarvar Супермодератор
Отправлено: 15 Ноября, 2011 - 17:24:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Я бы еще сказал так:
Пхп парсит строку по своим законам перед тем как передать её на вход регуляркопарсеру.
Поэтому для передачи двух обратных и еденицы может быть даже такое: "\\\\1".
 
 Top
webmos
Отправлено: 15 Ноября, 2011 - 17:28:47
Post Id



Гость


Покинул форум
Сообщений всего: 65
Дата рег-ции: Окт. 2011  
Откуда: Москва


Помог: 0 раз(а)




DeepVarvar пишет:
Я бы еще сказал так:
Пхп парсит строку по своим законам перед тем как передать её на вход регуляркопарсеру.
Поэтому для передачи двух обратных и еденицы может быть даже такое: "\\\\1".


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


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB