PHP'nin komut satırı seçeneği ayrıştırma, howto

4 Cevap php

PHP 5.2 Console_Getopt kullanarak, ve diğer dillerde (perl, bash, java) yılında getopt ne kadar farklı hakkında şaşırtıcı buluyorum. Herkes diziden args ayrıştırmak için nasıl tavsiye edebilirim "$ seçmesi" döndü?

php myprog.php-a vara-c-b varB

$o= new Console_Getopt;
$opts = $o->getopt($argv, "a:b:c");
print_r($opts);

/ / Print_r altına döndürür

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => a
                    [1] => varA
                )

            [1] => Array
                (
                    [0] => c
                    [1] =>
                )

            [2] => Array
                (
                    [0] => b
                    [1] => varB
                )

        )

    [1] => Array
        (
        )

)

Ben uzun soluklu aşağıda gibi bir şey, yapmaya başladı, bu yüzden php komut satırı bayrakları ile ilgili önerileri arıyorum.

foreach($opts[0] as $i -> $keyval) {
    list($key, $val) = $keyval;
    if($key == 'a') {
        print "valueForA: $val\n";
    } else if($key == 'b') {
        print "valueForB: $val\n";         
    } else if($key == 'c') {
        print "c is set\n";
    }
}

Bayrak örneğin $ seçmesidir {'a'} dizinin anahtar nerede PHP'nin getopt, Perl gibi değil bu yüzden ben bu uygun olurdu .. merak ediyorum.

4 Cevap

Inline belgelere başına

The return value is an array of two elements: the list of parsed options and the list of non-option command-line arguments. Each entry in the list of parsed options is a pair of elements - the first one specifies the option, and the second one specifies the option argument, if there was one.

Kolayca ikinci dizi atmak için bir taahhüdü kabul anlamına gelir dizilerin dizi ilk öğe seçeneği, ikinci eleman değerini, biçimini koruyarak.

Yerine bu varsayımı ile, deneyin

$o= new Console_Getopt;
$opts = $o->getopt($argv, "a:b:c");
print_r(getHashOfOpts($opts));

function getHashOfOpts($opts) {
	$opts = $opts[0];
	$return_opts = $opts;
	$return_opts = Array();
	foreach($opts as $pair){
		$return_opts[$pair[0]] = $pair[1];
	}
	return $return_opts;
}

beğeninize bir veri yapısı daha almak.

Ask bu, getopt diğer uygulama farklı neden gelince the maintainers.

PHP için GetOptionKit edin:

https://github.com/c9s/php-GetOptionKit

Synopsis

use GetOptionKit\GetOptionKit;

$getopt = new GetOptionKit;
$spec = $getopt->add( 'f|foo:' , 'option require value' );  # returns spec object.

$getopt->add( 'b|bar+' , 'option with multiple value' );
$getopt->add( 'z|zoo?' , 'option with optional value' );

$getopt->add( 'f|foo:=i' , 'option require value, with integer type' );
$getopt->add( 'f|foo:=s' , 'option require value, with string type' );

$getopt->add( 'v|verbose' , 'verbose flag' );
$getopt->add( 'd|debug'   , 'debug flag' );

$result = $opt->parse( array( 'program' , '-f' , 'foo value' , '-v' , '-d' ) );

$result = $opt->parse( $argv );

$spec = $result->verbose;
$spec = $result->debug;
$spec->value;  # get value

GetOptionKit \ OptionPrinter sizin için seçenekleri yazdırabilirsiniz:

* Available options:
              -f, --foo   option requires a value.
              -b, --bar   option with multiple value.
              -z, --zoo   option with optional value.
          -v, --verbose   verbose message.
            -d, --debug   debug message.
                 --long   long option name only.
                     -s   short option name only.

Ben Console_GetOpt benzer getopt etrafında sarıcı sınıf (), yazdı ama ben biraz daha güzel bence.

Bunu burada bulabilirsiniz: http://github.com/pete-otaqui/ClipClop

Getopt dayalı bir PHP seçeneği çözümleyici ().

ClipClop kolayca seçenekleri ile komut satırı araçları oluşturmak için olanak sağlar. ClipClop otomatik güzel biçimlendirilmiş kullanım talimatlarını oluşturur ve ayrıca parametreleri ve değerlerini erişmek için uygun bir API verir.

ClipClop onlar için gerekli ve isteğe bağlı parametreleri ve değerlerini işler. Yani gibi belirli bir seçenek "- ayrıntılı" gerekli ya da isteğe bağlı, kendi içinde ve hiçbir parametre değeri ya da isteğe bağlı bir veya gerekli birine sahip olabilir olabilir.

Varsayılan olarak, tek değerleri zorlar rağmen ClipClop, birden çok değer yönetir, düzenli ifadeler karşı doğrulamak ve size bazı türlerini ayrıştırmak: tamsayılar, sayılar, json ve adresler.

Quick Example Create a script called "environment_test", with the following code

#!/usr/bin/env php
<?php

// do this unless you have setup an Autoloader
require_once('/path/to/ClipClop.php');

$clipclop = new ClipClop();

$clipclop->addOption(array(
    'short' => 'e', // shortname, i.e. "-e"
    'long' => 'environment', // longname, i.e. "--environment"
    'value' => TRUE, // A value must be given such as "--environment=TEST"
    'help' => 'Set the environment', // help text for the 'usage' text
    'required' => TRUE, // Environment must be provided
));

// as soon as we ask for an option, ClipClop will parse CLI arguments with getopt()

$environment = $clipclop->getOption('e'); // returns the value set for 'e' OR 'environment'

print "You ran this script with environment: $environment";
?>

Çeşitli diğer seçenekleri ve birim testleri içermektedir.

Bu değer ne için, ben son zamanlarda PHP ayrıştırma komut satırı seçeneği benim kendi küçük proje hacklendi. Ben (tür gibi ... "PHP Ayrıştırma") Pharse diyoruz. Burada github indirmek için mevcut bulunuyor:

https://github.com/chrisallenlane/Pharse

O kadar ağır ben Trollop olan tüm özellikleri uygulamak vermedi ama neredeyse, bir liman düşünebiliriz Trollop esinlenilmiştir. (Benim kendi amaçları için, bu yüzden rahatsız etmedi - - alt komutlar gibi bazı özellikler gerek yoktu.)

Kütüphanenin genel özü kullanım, tek bir temel dosya gerektiren ve daha sonra pharse sınıf seçenekler tek bir birleştirici dizisi geçirerek içermesidir. Örneğin:

    <?php

   # specify some options
   $options = array(
        'user_name'     => array(
            'description'   => 'Your username',
            'default'       => 'admin',
            'type'          => 'string',
            'required'      => true,
            'short'         => 'u',
        ),

        'password' => array(
            'description'   => 'Your password',
            'default'       => 'sexsecretlovegod',
            'type'          => 'string',
            'required'      => true,
        ),
    );

# You may specify a program banner thusly:
$banner = "This program logs you in to the Gibson.";
Pharse::setBanner($banner);

# After you've configured Pharse, run it like so:
$opts = Pharse::options($options);

?>

Burada kütüphane tanıtan bir blog yazısı yazdı:

http://chris-allen-lane.com/2012/03/pharse-a-library-for-php-command-line-option-parsing/

Benim kişisel projeler için gündelik kullanım için kütüphane dışarı kesmek, yani bir üretim ortamına bu komut dosyasını dağıtmadan önce dikkatli kullanmak istiyorum. Ben bile henüz uygun ünite testleri uygulanması için kazanılmış değil, o yüzden siz uyardı.

Bunu dedi, ama, ben bu oldukça şık ve küçük bir senaryo olduğunu düşünüyorum, ve ben bunu hobi projeleri ve benzerleri için gayet uygun olduğunu düşünüyorum.