Last active
August 29, 2015 14:23
-
-
Save Leko/ac86a04d4816940bd71a to your computer and use it in GitHub Desktop.
古いPHP向けのCLIオプションパーサ
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
class CLI { | |
/** | |
* CLIオプションを取得する | |
* | |
* PHPのgetopt関数はプラットフォーム依存であり、Macで正常動作しなかった。 | |
* 動作環境に依らないオプションのパースをするには時前パースしか無かった。 | |
* PHP5.1にも対応したライブラリがあればそちらを使うほうが懸命。 | |
* | |
* ## オプションの仕様 | |
* ```sh | |
* $ php tools/runner.php workflow init -y -dfoo -x'bar1 bar2 bar3' --yes --database=foo --ext='bar1 bar2 bar3' | |
* array(6) { | |
* ["y"]=> | |
* bool(true) | |
* ["d"]=> | |
* string(3) "foo" | |
* ["x"]=> | |
* string(14) "bar1 bar2 bar3" | |
* ["yes"]=> | |
* bool(true) | |
* ["database"]=> | |
* string(3) "foo" | |
* ["ext"]=> | |
* string(14) "bar1 bar2 bar3" | |
* } | |
* ``` | |
* | |
* まとめ | |
* - 1文字オプションの場合は空白を空けずに値を記述する。 | |
* - この仕様により、1つのハイフンで複数のオプションを渡すことは出来ない。 | |
* - ロングオプションの場合は=のあとに価を記述する。 | |
* - 価がない場合そのオプションにはtrueを格納する | |
* - 価に空白が入る場合はクオートする。 | |
* | |
* @return array | |
*/ | |
public static function getOptions() | |
{ | |
global $argv; | |
$params = array(); | |
foreach($argv as $arg) { | |
// `-`で始まらないパーツは無視する | |
if(mb_strpos($arg, '-') !== 0) continue; | |
if(mb_strpos($arg, '--') === 0) { | |
$token = mb_substr($arg, 2); | |
if(mb_strpos($token, '=')) { | |
list($name, $value) = mb_split('=', $token); | |
} else { | |
$name = $token; | |
$value = true; | |
} | |
} else { | |
$name = mb_substr($arg, 1, 1); | |
$value = mb_substr($arg, 2); | |
if($value === '') $value = true; | |
} | |
$params[$name] = $value; | |
} | |
return $params; | |
} | |
} | |
CLI::getOptions(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment