PHP Парсер аргументов командной строки / Command line arguments parser



Простой парсер для разбора аргументов командной строки в php. Реализует паттерн «одиночка»

 

Как с ним работать

Вызываем из консоли скрипт:

1
$ php script.php --cli=clientname --engine=google --opt -f  arg


На стороне php:

1
2
3
4
5
6
7
8
$argvParser = G_ArgvParser::getInstance();
try {
   $cli = $argvParser->getOption('cli');
} catch (Exception $e) {
  // Throw exception option not found
}
$isExistFlagF = $argvParser->isExistFlag('f');
$isExistOption = $argvParser->isExistOption('opt');

 

Доступные методы

getInstance() Получает экземпляр класса ArgvParser
getExecuteFile() Получает имя вызванного скрипта
getOption($key) Получает значение параметра, а если параметр не существует, возвращает исключение
isExistOption($key) Возвращает булевское значение о существании параметра
isExistFlag($key) Возвращает булевское значение о существании соответствующего флага
getArguments() Получает все агрументы (не путать с параметрами и флагами)

 

class ArgvParser

А вот и сам класс:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
<?php
class ArgvParserException extends Exception {}

/**
 * Class for parse command line arguments
 * Singleton
 * Used function for parser command line args form php.net
 * @author artur geraschenko
 */

class ArgvParser
{
    const ENCODING = 'UTF-8';
   
    /**
     * @var ArgvParser
     */

    private static $instance = null;

    /**
     * Saved parsed command line arguments
     * @var unknown_type
     */

    private $arguments = array();
   
    /**
     * @return ArgvParser
     */

    public static function getInstance()
    {
        if (self::$instance === null)
            self::$instance = new self();
        return self::$instance;
    }

    /**
     * Get executed file name
     */

    public function getExecuteFile()
    {
        return (string)$this->arguments['exec'];
    }
   
    /**
     * Get option from commad line arguments get key
     * @param string $key
     */

    public function getOption($key)
    {
        $key = (string)$key;
        $this->checkExistOption($key);
        return $this->arguments['options'][$key];
    }
   
    /**
     * Throw exception if option isn't exist
     * @param unknown_type $key
     */

    private function checkExistOption($key)
    {
        if (!$this->isExistOption($key))
            throw new ArgvParserException('Option not found');
    }
   
    /**
     * Get bool value is exist option
     * @param bool $key
     */

    public function isExistOption($key)
    {
        return isset($this->arguments['options'][$key]);
    }

    /**
     * Get bool value is exist flag
     * @param bool $key
     */

    public function isExistFlag($key)
    {
        return isset($this->arguments['flags'][$key]);
    }

    /**
     * Get all arguments from command line
     */

    public function getArguments()
    {
        return (array)$this->arguments['arguments'];
    }
   
    private function __clone(){}
    private function __construct()
    {
        $this->arguments = $this->parseEnvironmentArguments();
    }
   
    /**
     * Try to parser environment command line arguments
     */

    private function parseEnvironmentArguments()
    {
        $this->checkEnvironmentArguments();
        return $this->parseArguments($_SERVER['argv']);
    }
   
    /**
     * Throw exception if arguments not found is environment ($_SERVER)
     */

    private function checkEnvironmentArguments()
    {
        if (!isset($_SERVER['argc']) || !isset($_SERVER['argv']) || (int)$_SERVER['argc'] !== (int)sizeof($_SERVER['argv']))
            throw new ArgvParserException("Environment arguments not found");
    }
   
    /**
     * Get from php.net and modifed to general format
     * @url http://www.php.net/manual/en/features.commandline.php#86616
     * @param array $args
     * @return array
     */

    private function parseArguments(array $args)
    {      
        $ret = array(
            'exec'      => '',
            'options'   => array(),
            'flags'     => array(),
            'arguments' => array(),
        );
        $ret['exec'] = array_shift($args);
        while (($arg = array_shift($args)) != NULL)
        {
            if (mb_substr($arg, 0, 2, self::ENCODING) === '--')
            {
                $option = mb_substr($arg, 2, mb_strlen($arg) - 2, self::ENCODING);
                $opt = array();
                if (mb_strpos($option, '=', 0, self::ENCODING) !== FALSE)
                    list($opt['key'], $opt['value']) = explode('=', $option, 2);
                else
                    $opt = array('key' => $option, 'value' => null);
                $ret['options'][$opt['key']] = $opt['value'];
                continue;
            }
           
            if (mb_substr($arg, 0, 1, self::ENCODING) === '-')
            {
                for ($i = 1; isset($arg[$i]) ; $i++)
                    $ret['flags'][$arg[$i]] = true;
                continue;
            }
            $ret['arguments'][] = $arg;
        }
        return $ret;
    }
}

Похожие статьи:

  1. мега парсер

Ответить


[ Ctrl + Enter ]