PHPのコマンドラインパラメータ解析ツール

<?PHP
/ **
*解析するツールのパラメータコマンドライン
* @author guolinchao
* @email [email protected]
* /
クラスのCommandLine
{
//ストアオプション
プライベートoptsArr静的$ = [];
//ストア引数
プライベート静的$ argsArr = [];
//かどうか解析された
プライベート静的$ = isParse falseに、

公共__construct関数(){
(自己isParseは:: $!){IF
セルフ:: parseArgs();
}
}

/ **
*オプションの値を取得します
* @文字列のparam | $ NULLのオプト
* @return配列|文字列| NULL
* /
パブリック関数getOptVal($ OPT = NULL){
IF(IS_NULLに($ OPT)){
リターンセルフ:: $ optsArr;
}他のIF(ISSET(セルフ: :$ optsArr [$ OPT]) ){
セルフ:: $ optsArrリターン[$ OPT];
}
戻りNULL;
}

/ **
*コマンドラインパラメータの値を取得する
* @param整数| $ NULLインデックス
* @return配列|文字列| NULL
* /
パブリック関数getArgVal($インデックス= NULL){
IF){(($インデックスIS_NULL)
戻り自己:: $ argsArr;
}そうIF(ISSET(自己:: $ argsArr [$インデックス])){
リターン$ argsArr自己:: [$インデックス];
}
リターンNULL;
}

/ **
*オプション・レジスタコールバックハンドラに対応し、コールバックがオプション値を受け取るための$パラメータでなければなりません
* @param文字列$ OPT
* @param $コーラブルコールバックのコールバック関数
* @throws InvalidArgumentException
* /
パブリック関数のオプション($ OPT、呼び出し可能$コールバック){
//チェック
{IF(is_callable(コールバック$)!)
スロー新しい新しいInvalidArgumentException(はsprintf(コールバック$) 'をコールバックA <%S>有効なわけではありません。');
}
IF(ISSET(自己:: $ optsArr [$ OPT])){
またcall_user_func(コールバック$、$ ::セルフoptsArr [$ OPT]);
} {他に
スロー新しい新InvalidArgumentException(はsprintf(、$ OPT) 'オプション不明<%S>。');
}
}

/ **
*かどうか-s短いオプションの形で
* @param文字列$オプト
*文字列@return |ブール値を返す短いオプション名
* /
パブリック静的関数isShortOptions($ OPT){
IF(するpreg_match(「/ ^ \ - ([-ZA-Z0-9] )$ /」、$ OPT、$ matchs)){
$ matchsを返す[1];
}
偽に戻り;
}

/ **
* -svalue短いオプションの形でかどうか
* @paramの文字列$ OPT
* @Return列|ブールオプション名と短い値を返すためのオプション
* /
パブリック静的機能isShortOptionsWithValue($ OPT){
IF(するpreg_match(「/ ^ \ - ([A-ZA-Z0-9])(\ S +)$ / 」、$ OPT、$ matchs)){
リターン[matchsが$ [1]、$ matchs [2]];
}
偽に戻り;
}

/ **
* --longopts長いオプションの形でかどうか
* @param文字列$オプト
* @return文字列|ブール戻り、長いオプション名
* /
パブリック静的関数isLongOptions($ OPT){
IF(するpreg_match(「/ ^ \ - \ - ([A-ZA-Z0-9 \ -_] 2 {、})$ /」、$ OPT、$ matchs)){
$ matchsを返す[1];
}
falseに復帰;
}

/ **
オプションの長い形式の*かどうか--longopts =値
* @param文字列$オプト
* @returnアレイ|ブール長いオプション名とオプション値を返します
* /
パブリック静的関数isLongOptionsWithValue($ OPT){
場合(するpreg_match( '/ ^ \ - \ - ([-ZA-Z0-9 \ -_] {2、})(:?。?\ =(*))$ /」、$ OPT、$ matchs)){
リターン[$ matchs [1]、$ matchs [2]。
}
falseを返します。
}

/ **
*是否是命令行参数
* @param文字列$値
* @return boolean型
* /
パブリック静的関数isArg($値){
リターン!するpreg_match( '/ ^ \ - /'、$値);
}

/ **
*解析命令行参数
* @return配列[ 'OPTS' => []、 '引数' => []]
* /
公共の最終的な静的関数parseArgs(){
グローバルの$ ARGV。
もし(自己:: $ isParse!){
//インデックス開始1から
$インデックス= 1;
$長=カウント数($ ARGV)。
一方、($インデックス<$長さ){
//現在の値
$ CURVAL = $ ARGV [$インデックス]。
//チェック、短いまたは長いオプション
の場合(($キー=自己:: isShortOptions($ CURVAL))||($キー=自己:: isLongOptions($ CURVAL))){
//先に行く
$インデックス++;
IF(ISSET($ ARGV [$インデックス])&&自己:: isArg($ ARGV [$インデックス])){
自己:: $ optsArr [$キー] = $ ARGV [$インデックス]。
}他{
自己:: $ optsArr [$キー] =はtrue。
//バック離れ
$ index--。
}
} //チェック、値を持つ短いか長いオプション
他の場合(($キー=自己:: isShortOptionsWithValue($ CURVAL))
||($キー=自己:: isLongOptionsWithValue($ CURVAL))){
自己:: $ optsArr [$キー[0] = $キー[1]。
} //引数
それ以外の場合(自己:: isArg($ CURVAL)){
自己:: $ argsArr [] = $ CURVAL。
}
// INCRインデックス
$インデックス++;
}
自己:: $ isParse =はtrue。//変更ステータス
}
リターン[ 'optsの' =>自己:: $ optsArr、 '引数' =>自己:: $ argsArr]。
}
}

// envをチェック
するif(PHP_SAPI = 'CLI'!){
終了( 'コマンドラインの下で実行してください。');
}

 

 

 

 

次のように使用方法は以下のとおりです。

<?PHP
などが'CommandLine.php';

$ argsを= :: parseArgs CommandLineを();
しますprint_r($ argsを);

//または
$ CMD =新新CommandLineを();
$ cmd->オプション( 'H'、関数($ヴァル){
//処理オプションH
// $ valのオプション値
// ...
エコー'オプション-Hハンドラ。';
});

----------------
免責事項:この記事は、氷に元の記事CSDNのブロガー葉」、CC 4.0 BY-SAの著作権契約に従っている再現し、元のソースとのリンクを添付してくださいこの文。
オリジナルリンクします。https://blog.csdn.net/u012302539/article/details/62045208

おすすめ

転載: www.cnblogs.com/caicaizi/p/11970586.html