Анализ командной строки. Мешает услужливость PHP или мой плохой код?

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:
Array  (
      [0] => test.php
      [1] => --option--option 
)
Отсюда вопрос: как заставить PHP передать значение вместе с экранирующими кавычками или как получить исходную строку, не разобранную PHP (то есть --option"--option")?
 

AnToXa

prodigy-одаренный ребенок
это не пхп убирает кавычки, пробелы и что ты там еще говорил.
это shell интерпретирует escape sequences и пробелы и все остальное, пхп как получила argc/argv, так тебе их и отдала.

и совершенно невозможно выяснить что там юзер _хотел_ написать, имя параметр или значение параметра ибо компьютер - не телепат.
 

Develar

Новичок
Если пользователь употребил кавычки для экранирования, то значит он подразумевал escape sequences как не служебные, а просто символы. Вопрос о том, хотел он кавычки употребить, или нет, я не рассматриваю - это действительно глупо.

Значит на уровне PHP программы уже никак нельзя получить исходную строку с экранирующими символами для анализа - только на уровне интерпретатора командной строки - я правильно понял? Спасибо.
 

AnToXa

prodigy-одаренный ребенок
Если пользователь употребил кавычки для экранирования, то значит он подразумевал escape sequences как не служебные, а просто символы.
напротив, если пользователь понял и написал эти самые escape sequences, то он подразумевал именно как служебные, т.е. служащие для выражения некоторой информации :D

Значит на уровне PHP программы уже никак нельзя получить исходную строку с экранирующими символами для анализа - только на уровне интерпретатора командной строки - я правильно понял? Спасибо.
дело в том, что:
1. исходных строк может быть сколько угодно много, т.к. можно грамматик для шеллов придумать кучу, хотя скорее всего можно выделить некий subset существующих.
2. не нужно оно тебе в общем-то, пусть пользователь пишет параметры правильно, чтобы ты их мог получить. и не стоит умножать сущности сверх необходимого, т.е. вдобавок к заморочкам шелла, ты еще и заморочки своего приложения добавишь.
3. может быть использовать конфиг файлы? там ты сам можешь все как хочешь интерпретировать, ввести свою грамматику и полный набор всех остальных аттракционов прилагается.
 

Develar

Новичок
напротив, если пользователь понял и написал эти самые escape sequences, то он подразумевал именно как служебные, т.е. служащие для выражения некоторой информации
Но пишет то он их в кавычках :) - поэтому он хочет видеть тире как тире, а не как escape sequences.

2) Да, тут ситуация как с html и xhtml. Дело в том, что если мы передим программе php (SAPI CLI) параметр -vv, она не пикнет и среагирует как на -v (так делает и PHP при обработке инструкции array), а хотелось бы предупредить и послать пользователя исправляться. В общем-то ... из менее 5 % и возиться не надо. Ясно.
3) Использую. Просто есть ряд типов программ, которые должны для удобства принимать параметры конфигурации из командной строки.

Оставлю мечту идиота о 100% вежливой программе и займусь реализацией более продуктивных вещей.
 
Сверху