PHP 命令行参数解析工具类
<?php
/**
* 命令行参数解析工具类
* @author guolinchao
* @email luoyecb@163.com
*/
class CommandLine
{
// store options
private static $optsArr = [];
// store args
private static $argsArr = [];
// 是否解析过
private static $isParse = false;
public function __construct() {
if(!self::$isParse) {
self::parseArgs();
}
}
/**
* 获取选项值
* @param string|NULL $opt
* @return array|string|NULL
*/
public function getOptVal($opt = NULL) {
if(is_null($opt)) {
return self::$optsArr;
} else if(isset(self::$optsArr[$opt])) {
return self::$optsArr[$opt];
}
return null;
}
/**
* 获取命令行参数值
* @param integer|NULL $index
* @return array|string|NULL
*/
public function getArgVal($index = NULL) {
if(is_null($index)) {
return self::$argsArr;
} else if(isset(self::$argsArr[$index])) {
return self::$argsArr[$index];
}
return null;
}
/**
* 注册选项对应的回调处理函数, $callback 应该有一个参数, 用于接收选项值
* @param string $opt
* @param callable $callback 回调函数
* @throws InvalidArgumentException
*/
public function option($opt, callable $callback) {
// check
if(!is_callable($callback)) {
throw new InvalidArgumentException(sprintf('Not a valid callback <%s>.', $callback));
}
if(isset(self::$optsArr[$opt])) {
call_user_func($callback, self::$optsArr[$opt]);
} else {
throw new InvalidArgumentException(sprintf('Unknown option <%s>.', $opt));
}
}
/**
* 是否是 -s 形式的短选项
* @param string $opt
* @return string|boolean 返回短选项名
*/
public static function isShortOptions($opt) {
if(preg_match('/^\-([a-zA-Z0-9])$/', $opt, $matchs)) {
return $matchs[1];
}
return false;
}
/**
* 是否是 -svalue 形式的短选项
* @param string $opt
* @return array|boolean 返回短选项名以及选项值
*/
public static function isShortOptionsWithValue($opt) {
if(preg_match('/^\-([a-zA-Z0-9])(\S+)$/', $opt, $matchs)) {
return [$matchs[1], $matchs[2]];
}
return false;
}
/**
* 是否是 --longopts 形式的长选项
* @param string $opt
* @return string|boolean 返回长选项名
*/
public static function isLongOptions($opt) {
if(preg_match('/^\-\-([a-zA-Z0-9\-_]{2,})$/', $opt, $matchs)) {
return $matchs[1];
}
return false;
}
/**
* 是否是 --longopts=value 形式的长选项
* @param string $opt
* @return array|boolean 返回长选项名及选项值
*/
public static function isLongOptionsWithValue($opt) {
if(preg_match('/^\-\-([a-zA-Z0-9\-_]{2,})(?:\=(.*?))$/', $opt, $matchs)) {
return [$matchs[1], $matchs[2]];
}
return false;
}
/**
* 是否是命令行参数
* @param string $value
* @return boolean
*/
public static function isArg($value) {
return ! preg_match('/^\-/', $value);
}
/**
* 解析命令行参数
* @return array ['opts'=>[], 'args'=>[]]
*/
public final static function parseArgs() {
global $argv;
if(!self::$isParse) {
// index start from one
$index = 1;
$length = count($argv);
while($index < $length) {
// current value
$curVal = $argv[$index];
// check, short or long options
if( ($key = self::isShortOptions($curVal)) || ($key = self::isLongOptions($curVal)) ) {
// go ahead
$index++;
if( isset($argv[$index]) && self::isArg($argv[$index]) ) {
self::$optsArr[$key] = $argv[$index];
} else {
self::$optsArr[$key] = true;
// back away
$index--;
}
} // check, short or long options with value
else if( ($key = self::isShortOptionsWithValue($curVal))
|| ($key = self::isLongOptionsWithValue($curVal)) ) {
self::$optsArr[$key[0]] = $key[1];
} // args
else if( self::isArg($curVal) ) {
self::$argsArr[] = $curVal;
}
// incr index
$index++;
}
self::$isParse = true; // change status
}
return ['opts'=>self::$optsArr, 'args'=>self::$argsArr];
}
}
// env check
if(PHP_SAPI != 'cli') {
exit('Please run under command line.');
}
用法如下:
<?php
include 'CommandLine.php';
$args = CommandLine::parseArgs();
print_r($args);
// or
$cmd = new CommandLine();
$cmd->option('h', function ($val){
// 处理选项 h
// $val 选项值
// ...
echo 'Option h handler.';
});
————————————————
版权声明:本文为CSDN博主「落叶成冰」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012302539/article/details/62045208
PHP 命令行参数解析工具类的更多相关文章
- python命令行参数解析OptionParser类用法实例
python命令行参数解析OptionParser类用法实例 本文实例讲述了python命令行参数解析OptionParser类的用法,分享给大家供大家参考. 具体代码如下: from opt ...
- Python 中命令行参数解析工具 docopt 安装和应用
什么是 docopt? 1.docopt 是一种 Python 编写的命令行执行脚本的交互语言. 它是一种语言! 它是一种语言! 它是一种语言! 2.使用这种语言可以在自己的脚本中,添加一些规则限制. ...
- optparse(命令行参数解析工具)
在用Python做自动化的时候,命令行的解析一定是少不了的,有很多命令行解析工具库,其中Python内建的一个库optparse,还是比较好用的 1.贴代码并注释 # coding=UTF-8 fro ...
- Python 命令行参数解析工具 argparse
为什么需要argparse 开门见山,举一个简易计算器代码的例子,其中sys.argv用来读取脚本执行时后面传入的参数. def calculator(x, y, operation): if &qu ...
- python命令行参数解析模块argparse和docopt
http://blog.csdn.net/pipisorry/article/details/53046471 还有其他两个模块实现这一功能,getopt(等同于C语言中的getopt())和弃用的o ...
- gflags命令行参数解析
gflags库是google开源的命令行参数解析工具. 安装 官方没有提供二进制库,但是Debian/Ubuntu平台本身提供了二进制库,可以直接git clone https://github.co ...
- UE4命令行参数解析
转自:https://blog.csdn.net/u012999985/article/details/53544389 一 .命令行参数简述命令行参数是一连串的关键字字符串,当运行可执行文件时可以通 ...
- golang-flag - 命令行参数解析
flag - 命令行参数解析 在写命令行程序(工具.server)时,对命令参数进行解析是常见的需求.各种语言一般都会提供解析命令行参数的方法或库,以方便程序员使用.如果命令行参数纯粹自己写代码解析, ...
- [Go] 命令行参数解析包(flag 包)使用详解
Go 的 flag 包可以解析命令行的参数. 一.命令行语法 命令行语法主要有以下几种形式: cmd -flag // 只支持bool类型 cmd -flag=xxx cmd -flag ...
随机推荐
- android启动时间慢的问题
[转]对于Android的性能这方面评估,大部分都是有超级兔子去比跑分的,还是不能反映全面的问题.就我知道的而言,应用启动时间是很影响用户体验的一个性能方面问题. 最近的一个项目,别人都说应用启动慢 ...
- fastjson 将json字符串转化成List<Map<String, Object>>
亲测可行,如下: JSON.parseObject(jsonstr, new TypeReference<List<Map<String, Object>>>() ...
- 常用内置模块(一)--time、os、sys、random、shutil、pickle、json
一.time模块 Python中,通常有这几种方式来表示时间: 1.时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量.我们运行“type( ...
- css3过渡动画 transition
transition CSS3 过渡是元素从一种样式逐渐改变为另一种的效果. 要实现这一点,必须规定两项内容: 指定要添加效果的CSS属性 指定效果的持续时间 例如 这是下面代码的预览界面预览界面 & ...
- 剑指Offer(十七):树的子结构
剑指Offer(十七):树的子结构 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baidu_ ...
- BFS算法的优化 双向宽度优先搜索
双向宽度优先搜索 (Bidirectional BFS) 算法适用于如下的场景: 无向图 所有边的长度都为 1 或者长度都一样 同时给出了起点和终点 以上 3 个条件都满足的时候,可以使用双向宽度优先 ...
- 201671010442 葸铃 实验十四 团队项目评审&课程学习总结
项目 内容 这个作业属于哪个课程 课程 2016级计算机科学与工程学院软件工程(西北师范大学) 作业要求 实验十四 团队项目评审&课程学习总结 作业学习目标 团队项目评审&课程学习总结 ...
- Discuz! 3.3全站帖子自动添加图片alt标签
网站想要更好的适应搜索引擎的话,就要把最基础的一些小优化标签做好, 虽然说现在搜索都很厉害能够识别图片,但是除非的你的图片每一张都是周杰伦.范冰冰等知名图片... 不然你还是要给你自己的图添加alt标 ...
- mysql 的 docker image 使用(官方文档节选)
1.创建一个 mysql 实例: $ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag 2.创 ...
- 算法学习笔记——sort 和 qsort 提供的快速排序
这里存放的是笔者在学习算法和数据结构时相关的学习笔记,记录了笔者通过网络和书籍资料中学习到的知识点和技巧,在供自己学习和反思的同时为有需要的人提供一定的思路和帮助. 从排序开始 基本的排序算法包括冒泡 ...