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

黄舟
发布: 2017-03-15 17:15:03
原创
1789人浏览过

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

<?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.';
});
登录后复制

命令行测试:

代码小浣熊
代码小浣熊

代码小浣熊是基于商汤大语言模型的软件智能研发助手,覆盖软件需求分析、架构设计、代码编写、软件测试等环节

代码小浣熊 51
查看详情 代码小浣熊


以上就是PHP 命令行参数解析工具类的示例代码的详细内容,更多请关注php中文网其它相关文章!

相关标签:
php
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号