Arguments-Parser
In PHP-Anwendungen für die Kommandozeile (CLI) ist es möglich, Befehlszeilenargumente wie für jedes andere Programm zu übergeben. Diese werden von PHP aber nicht ausgewertet, im Gegensatz zu den URL-Parametern auf Webseiten. Die hier vorgestellten Funktionen ermöglichen es, gezielt auf einzelne Parameter zuzugreifen und damit verbundene Werte abzufragen.
Download (PHP-Datei, 3 kB)
// Command line arguments parser
// Known options definition: (where each "=" at the end denotes a following argument)
// $known_opts = array('a', 'b', 'c=');
// $known_longopts = array('aaa', 'bbb', 'ccc=');
$args = array();
$opts = array();
if (!isset($known_opts)) $known_opts = array();
if (!isset($known_longopts)) $known_longopts = array();
$process = true;
for ($i = 0; $i < $argc; $i++)
{
$arg = $argv[$i];
// This signals the end of any parameters
if ($arg == '--')
{
$process = false;
}
// Check long options
elseif ($process && substr($arg, 0, 2) == '--')
{
$ok = false;
foreach ($known_longopts as $opt)
{
$add_args = 0;
while (substr($opt, -1) == '=')
{
$add_args++;
$opt = substr($opt, 0, -1);
}
if ($arg == '--' . $opt)
{
$this_opt = array($opt);
while ($add_args--)
{
$i++;
if (!isset($argv[$i])) die("Too few parameters for long option '$arg'\n");
$this_opt[] = $argv[$i];
}
$opts[] = $this_opt;
$ok = true;
break;
}
}
if (!$ok)
{
die("Unrecognised long option '$arg'\n");
}
}
// Check short options
// Don't touch a '-' on its own, leave it as normal parameter
elseif ($process && strlen($arg) > 1 && substr($arg, 0, 1) == '-')
{
// For each character
for ($c = 1; $c < strlen($arg); $c++)
{
$ch = $arg{$c};
$ok = false;
foreach ($known_opts as $opt)
{
$add_args = 0;
while (substr($opt, -1) == '=')
{
$add_args++;
$opt = substr($opt, 0, -1);
}
if ($ch == $opt)
{
$this_opt = array($opt);
while ($add_args--)
{
$i++;
if (!isset($argv[$i])) die("Too few parameters for option '-$ch'\n");
$this_opt[] = $argv[$i];
}
$opts[] = $this_opt;
$ok = true;
break;
}
}
if (!$ok)
{
die("Unrecognised option '-$ch'\n");
}
}
}
// Non-options
else
{
$args[] = $arg;
}
}
// Find if an option is set
// Optionally checks a second name and combines with OR
//
function is_option_set($name, $name2 = null)
{
global $opts;
foreach ($opts as $opt)
{
if ($opt[0] == $name)
{
return true;
}
if ($name2 && $opt[0] == $name2)
{
return true;
}
}
return false;
}
// Get the first option parameter for a given option name
// Only finds the first occurance of an option
// Optionally checks a second name
//
function get_option_value($name, $name2 = null)
{
global $opts;
foreach ($opts as $opt)
{
if ($opt[0] == $name)
{
return $opt[1];
}
if ($name2 && $opt[0] == $name2)
{
return $opt[1];
}
}
}
// Get the first option parameter for a given option name
// Finds all occurances of an option
// Optionally checks a second name
//
function get_all_option_values($name, $name2 = null)
{
global $opts;
$ret = array();
foreach ($opts as $opt)
{
if ($opt[0] == $name)
{
$ret[] = $opt[1];
}
if ($name2 && $opt[0] == $name2)
{
$ret[] = $opt[1];
}
}
return $ret;
}
// Get all option parameters for a given option name
// Only finds the first occurance of an option
// Optionally checks a second name
//
function get_option_all_values($name, $name2 = null)
{
global $opts;
foreach ($opts as $opt)
{
if ($opt[0] == $name)
{
return array_slice($opt, 1);
}
if ($name2 && $opt[0] == $name2)
{
return array_slice($opt, 1);
}
}
}
// Get the n-th argument
//
function get_argument($n)
{
global $args;
if (isset($args[$n])) return $args[$n];
return '';
}
?>
Beispiel: Aufruf des Programms
./demoscript -c -i 12.34.56.78 --cert mydomain.crt mydomain.de
Beispiel: Verwendung im Programm
{
echo "Your syntax description here.\n";
echo "\n";
echo "Usage:\n";
echo " demoscript [options] <domain> [<path>]\n";
echo "\n";
echo "Options:\n";
echo " -c, --cgi Enable CGI execution on this domain\n";
echo " -s, --ssl Enable SSL access to this domain\n";
echo " -i, --ip <num> Bind this domain to a specific IP address\n";
echo " --cert <file> Custom SSL certificate file suffix\n";
echo "\n";
echo "<domain> is the full domain name\n";
echo "<path> is the document root subdirectory for this domain\n";
exit();
}
$known_opts = array('c', 's', 'i=');
$known_longopts = array('cgi', 'ssl', 'ip=', 'cert=');
require('arguments.inc.php');
$cgi = is_option_set('c', 'cgi');
$ssl = is_option_set('s', 'ssl');
$ip = get_option_value('i', 'ip') or $ip = 0;
$certfile = get_option_value('cert');
$domain = get_argument(1);
$path = get_argument(2);
if ($domain == '') die("No domain name specified.\n");
Licence, terms of use
This programme is freely available as source code and compiled version, without restrictions (“public domain”). There is no warranty, not even for merchantability or fitness for a particular purpose. I am not liable for any damage caused through appropriate or inappropriate use.


Statistik wird geladen...