PHP 命令行参数解析工具类的示例代码

/**

* 命令行参数解析工具类

* @author guolinchao

*/

class CommandLine

{

// 临时记录短选项的选项值

private static $shortOptVal = null;

// options value

private static $optsArr = array();

// command args

private 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) {

// check

if(!is_callable($callback)) {

throw new Exception(sprintf('Not a valid callback function [%s].', $callback));

}

if(isset(self::$optsArr[$opt])) {

// call user function

call_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 options

if( ($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 value

else if( false !== ($key = self::isShortOptionsWithValue($curVal))

|| false !== ($key = self::isLongOptionsWithValue($curVal)) ) {

$retArgs['opts'][$key] = self::$shortOptVal;

} // command args

else if( self::isArg($curVal) ) {

$retArgs['args'][] = $curVal;

}

// incr index

$index++;

}

self::$optsArr = $retArgs['opts'];

self::$argsArr = $retArgs['args'];

self::$isParse = true;

return $retArgs;

}

}

用法如下:<?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.';

});

命令行测试:

php解析命令行参数选项,PHP 命令行参数解析工具类的示例代码相关推荐

  1. linux命令基础知识 管道流,linux基础知识-I/O重定向,管道(示例代码)

    系统设定 默认输出设备:标准输出,STDOUT, 1 默认输入设备:标准输入, STDIN, 0 标准错误输出:STDERR, 2 标准输入:键盘 标准输出和错误输出:显示器 I/O重定向: Linu ...

  2. linux用命令导出mysql数据库,linux下导入、导出mysql数据库命令(示例代码)

    一.导出数据库用mysqldump命令(注意mysql的安装路径,即此命令的路径): 1.导出数据和表结构: mysqldump -u用户名 -p密码 数据库名 > 数据库名.sql #/usr ...

  3. java向Word模板中替换书签数据,插入图片,插入复选框,插入Word中表格的行数据,删除表格行数据

    java向Word模板中替换书签数据,插入图片,插入复选框,插入Word中表格的行数据,删除表格行数据 使用插件:spire.doc 创建工具类,上代码: import com.spire.doc.D ...

  4. linux 网络通讯 命令,Linux—网络通讯管理命令

    一.ping命令 1. ping主机名2. ping域名 [root@localhost~]# pingwww.baidu.com3. pingIP地址 [root@localhost~]# ping ...

  5. linux命令详解之ls命令

    ls命令概述 ls命令用于显示文件目录列表,和Windows系统下DOS命令dir类似.当执行ls命令时,默认显示的只有非隐藏文件的文件名.以文件名进行排序及文件名代表的颜色显示.当不加参数时,默认列 ...

  6. dom4j 学习 -- 封装dom4j工具类+如何使用dom4j解析

    今天项目里面用到dom4j解析xml数据,特地整理了一下封装dom4j的工具方法,使用dom4j来解析xml文档. 首先是封装了dom4j的工具类: package myDOM4J;import ja ...

  7. python命令行参数作用_Python命令行参数解析模块argparse

    前言 更多内容,请访问我的 个人博客. 以前 optparse 比较火,但是在python2.7版本后,官方不再维护这个模块,转而大力支持 argparse . argparse 模块可以让人轻松编写 ...

  8. python 参数_python脚本命令行参数解析

    前言 在python命令行参数的解析模块中,我们常用的就是sys内置模块,但该模块的功能过于原始单一,很多具体的逻辑功能还得靠我们自己手动实现,实在较为麻烦.在这里向大家推荐一个好用的参数解析的模块a ...

  9. linux的compgen命令,linux shell中的命令自动补全(compgen complete)与 命令行参数解析...

    很多时候,当我们写一个脚本时,我们总会提供一些可选的命令选项.当可选项比较多的时候,比如git, 如果能够提供命令自动补全,无疑是锦上添花的事.而且个人认为,这种方式,比采用将命令做成选择菜单要更好一 ...

最新文章

  1. 浅谈网络游戏《天龙X部》的文件加密格式
  2. storm流式大数据处理流行吗
  3. html5赛车小游戏,html5公路赛车小游戏
  4. MooTools Class 使用、继承详解
  5. c#与mysql数据库连接以及.net framework版本修改问题
  6. Java黑皮书课后题第7章:*7.13(随机数选择器)编写一个方法,返回1到54之间的随机数,但不能是传递到实参中的数。指定如下方法头
  7. 计算机科普小知识——Win7系统32位与64位的区别,该如何选择?
  8. 使用函数进行邮件发送的示例
  9. 64位系统目录在那里_旷视王珏:前Adobe首席科学家,手握64项专利,曾助力奥斯卡...
  10. Linux -- ×××服务简绍、配置及应用(2)
  11. [转]Newtonsoft.Json高级用法
  12. 吴恩达神经网络和深度学习-学习笔记-29-卷积的基础知识
  13. Atitit java读取tif文件为空null的解决 图像处理
  14. en55032最新标准下载_欧盟新EMC标准EN55032
  15. Scratch下载(各版本都可下载)
  16. win10/11: Windows Audio无法启动 错误 0x80070005:拒绝访问
  17. Android实现模拟装备购买
  18. 美团Robust热修复工具使用记录
  19. 使用react完成图片放大功能(淘宝放大镜)
  20. Spring Boot中使用Spring Data JPA示例

热门文章

  1. 【Python-3.5】win7安装Pygame
  2. ServiceStack.Redis 连接有密码的Redis问题解决
  3. [解决方案]Window 2008 R2 + IIS7.5 + VS2013 错误代码 0x80070002
  4. nodejs 写服务器解决中文乱码问题
  5. SpringMvc 400 Bad Request解决方法
  6. Win10蓝牙鼠标老是断连卡顿的解决方法
  7. 项目出现 The superclass “javax.servlet.http.HttpServlet“ was not found on the Java Build Path 解决方法
  8. 如何编写内联if语句用于打印?
  9. ios 销毁当前页面重新开启_利用Vue中keep-alive,快速实现页面缓存
  10. Bsdiff:Bsd断电差分升级