PHP 命令列參數解析工具類

來源:互聯網
上載者:User

標籤:callback   註冊   file   cal   cep   options   令行   oca   function   

<?php/** * 命令列參數解析工具類 * @author guolinchao */class CommandLine{// 臨時記錄短選項的選項值private static $shortOptVal = null;// options valueprivate static $optsArr = array();// command argsprivate static $argsArr = array();// 是否已解析過命令列參數private static $isParse = false;public function __construct() {if(!self::$isParse) {self::parseArgs();}}/** * 擷取選項值 */public function getOptVal($opt) {if(isset(self::$optsArr[$opt])) {return self::$optsArr[$opt];}return null;}/** * 擷取命令列參數 */public function getArg($index) {if(isset(self::$argsArr[$index])) {return self::$argsArr[$index];}return null;}/** * 註冊選項對應的回呼函數, $callback 應該有一個參數, 用於接收選項值 */public function option($opt, $callback) {// checkif(!is_callable($callback)) {throw new Exception(sprintf(‘Not a valid callback function [%s].‘, $callback));}if(isset(self::$optsArr[$opt])) {// call user functioncall_user_func($callback, self::$optsArr[$opt]);} else {throw new Exception(sprintf(‘Unknown option [%s].‘, $opt));}}/** * 是否是 -s 形式的短選項 */public static function isShortOptions($opt) {if(preg_match(‘/^\-([a-zA-Z])$/‘, $opt, $matchs)) {return $matchs[1];}return false;}/** * 是否是 -hlocalhost 形式的短選項 */public static function isShortOptionsWithValue($opt) {if(preg_match(‘/^\-([a-zA-Z])([\S]+)$/‘, $opt, $matchs)) {self::$shortOptVal = $matchs[2];return $matchs[1];}return false;}/** * 是否是 --help 形式的長選項 */public static function isLongOptions($opt) {if(preg_match(‘/^\-\-([a-zA-Z0-9\-_]{2,})$/‘, $opt, $matchs)) {return $matchs[1];}return false;}/** * 是否是 --options=opt_value 形式的長選項 */public static function isLongOptionsWithValue($opt) {if(preg_match(‘/^\-\-([a-zA-Z0-9\-_]{2,})(?:\=(.*?))$/‘, $opt, $matchs)) {$tmpV = trim($matchs[2], ‘"‘);self::$shortOptVal = empty($tmpV) ? true : $tmpV;return $matchs[1];}return false;}/** * 是否是命令列參數 */public static function isArg($value) {return ! preg_match(‘/^\-/‘, $value);}/** * 解析命令列參數 */public static function parseArgs() {global $argv;if(self::$isParse) {return ;}// index start from 1.$index = 1;$length = count($argv);$retArgs = array(‘opts‘=>array(), ‘args‘=>array());while($index < $length) {// current value$curVal = $argv[$index];// short options or long optionsif( ($sp = self::isShortOptions($curVal)) || ($lp = self::isLongOptions($curVal)) ) {// options array key$key = $sp ? $sp : $lp;// go ahead$index++;if( isset($argv[$index]) && self::isArg($argv[$index]) ) {$retArgs[‘opts‘][$key] = $argv[$index];} else {$retArgs[‘opts‘][$key] = true;// back away$index--;}} // short options with value || long options with valueelse if( false !== ($key = self::isShortOptionsWithValue($curVal)) || false !== ($key = self::isLongOptionsWithValue($curVal)) ) {$retArgs[‘opts‘][$key] = self::$shortOptVal;} // command argselse if( self::isArg($curVal) ) {$retArgs[‘args‘][] = $curVal;}// incr index$index++;}self::$optsArr = $retArgs[‘opts‘];self::$argsArr = $retArgs[‘args‘];self::$isParse = true;return $retArgs;}}


用法如下:

<?phpinclude ‘CommandLine.php‘;$args = CommandLine::parseArgs();print_r($args);// or$cmd = new CommandLine();$cmd->option(‘h‘, function ($val){// 處理選項 h // $val 選項值// ...echo ‘Option h handler.‘;});

命令列測試:



PHP 命令列參數解析工具類

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.