Develar
Новичок
Анализ командной строки. Мешает услужливость PHP или мой плохой код?
Возникла потребность в написании Command Line Parser для консольного скрипта PHP.
Проблема не в написании работающей программы, есть готовые решения на php.net в комментариях и на hotscripts.com.
Проблема в написании программы, которая информировала бы пользователя об ошибке корректно - указывая на причину, а не последствия.
Для экранирования символов подобных "& *-" в консоли надо применять кавычки. А когда PHP в переменной $_SERVER['argv'] передает нам параметры, он эти кавычки убирает.
В результате после запуска [cl]test.php --option "test value"[/cl] мы имеем строку параметров [result]--option test value[/result] и никаким регулярным выражением не выяснить, пробел между словами test и value является служебным или он является просто пробелом. И в результате невозможно сказать, то ли пользователь ошибся, написав test вместо --test, то ли test value является значением параметра --option.
Если с пробелом все ясно - PHP режет на кусочки и упаковывает в массив $_SERVER['argv'] руководствуясь пробелом, поэтому если этот пробел встречается в элементе $_SERVER['argv'] значит при рождении он был экранирован, то с тире не так не разберешься - и [cl]test.php --option"--option"[/cl], и [cl]test.php --option--option[/cl] приведет к одному и тому же результату:
Отсюда вопрос: как заставить PHP передать значение вместе с экранирующими кавычками или как получить исходную строку, не разобранную PHP (то есть --option"--option")?
Возникла потребность в написании Command Line Parser для консольного скрипта PHP.
Проблема не в написании работающей программы, есть готовые решения на php.net в комментариях и на hotscripts.com.
Проблема в написании программы, которая информировала бы пользователя об ошибке корректно - указывая на причину, а не последствия.
Для экранирования символов подобных "& *-" в консоли надо применять кавычки. А когда PHP в переменной $_SERVER['argv'] передает нам параметры, он эти кавычки убирает.
В результате после запуска [cl]test.php --option "test value"[/cl] мы имеем строку параметров [result]--option test value[/result] и никаким регулярным выражением не выяснить, пробел между словами test и value является служебным или он является просто пробелом. И в результате невозможно сказать, то ли пользователь ошибся, написав test вместо --test, то ли test value является значением параметра --option.
Если с пробелом все ясно - PHP режет на кусочки и упаковывает в массив $_SERVER['argv'] руководствуясь пробелом, поэтому если этот пробел встречается в элементе $_SERVER['argv'] значит при рождении он был экранирован, то с тире не так не разберешься - и [cl]test.php --option"--option"[/cl], и [cl]test.php --option--option[/cl] приведет к одному и тому же результату:
PHP:
Array (
[0] => test.php
[1] => --option--option
)

- поэтому он хочет видеть тире как тире, а не как escape sequences.