2016-04-09 18 views
2

Bir dizeden komut argümanlarını ayrıştırmak için yerel bir "PHP yolu" var mı? bayrak belirledikten sonra ve dize - "" Yani bir bayrak olarak tanımlanırBir dizeden komut satırı bağımsız değişkenlerini ayrıştırmak için bir dizeyi ayrıştırdınız mı?

array(3) { ['color'] => string(3) "red" ['is_corvette'] => string(4) "true" }

:

some random string --color=red --is_corvette=true 

aşağıdaki diziyi oluşturmak istiyorum: Örneğin, aşağıdaki dizeyi verilen öznitelik ve karşılık gelen değer.

PHP'nin getopt() fonksiyonu hakkında biliyorum, ama bu sadece komut satırı üzerinden bir PHP komut dosyası geçirilen argümanları ayrıştırmak için kullanılabilir görünüyor ve talebe

üzerinde herhangi bir dize ayrıştırmak mümkün görünmüyor
+0

Bu dize oldukça kolay bir şekilde belirtebilirsiniz – Pooya

+1

PEAR'ın Console_Getopt' sınıfını kullanabilirsiniz. Getopt'u sever ama ipi kabul eder. –

cevap

0

daha sonra, onun sonucu böyle, sen ne beklediğini tam olarak almak için yeniden biçimlendirmek, her çağrının bulmak için bir normal ifade kullanabilirsiniz: Eğer daha genel kullanıma yönelik bir işlev inşa edebilir şimdiki örnekte Ötesi

$s = 'some random string --color=red --is_corvette=true'; 
preg_match_all(
    '/--((?:color|is_corvette)=[\S]+)/', 
    $s, $matches 
); 
if ($matches AND $matches[1]) { 
    foreach ($matches[1] AS $match) { 
    $match = explode('=', $match); 
    $result[$match[0]] = $match[1]; 
    } 
} 

, Önceden tanımlanmış olası bir olası anahtar ve bunların varsayılan değerlerini dikkate alarak:

function args_from_string($string, $set) { 
    preg_match_all(
     '/--((?:' . implode('|', array_keys($set)) . ')=[\S]+)/', 
     $string, $matches 
    ); 
    if ($matches AND $matches[1]) { 
     foreach ($matches[1] AS $match) { 
     $match = explode('=', $match); 
     $set[$match[0]] = $match[1]; 
     } 
    } 
    return $set; 
} 

$predefined_set = [ 
    'color'  => 'black', 
    'is_corvette' => 'false', 
    'other_arg' => 'value', 
    // ... 
]; 
$current_set = args_from_string(
    'some random string --color=red --is_corvette=true', 
    $predefined_set 
); 
İlgili konular