PHP相当于Python的shlex.split

时间:2013-02-25 19:18:32

标签: php shlex

我正在尝试解析包含空格分隔的key =>值对的文件,其格式如下:

host=db test="test test" blah=123

通常,此文件由Python提取并使用shlex.split进行解析,但我无法找到PHP等效文件,并且我尝试使用preg_splitstrtok对其进行逻辑排序效率不高。

PHP是否等同于Python的shlex.split

2 个答案:

答案 0 :(得分:2)

不幸的是,没有内置的PHP函数本身处理这样的分隔参数。但是,你可以使用一点regex和一些数组行走来快速构建一个。这只是一个示例,仅适用于您提供的字符串类型。需要将任何额外条件添加到正则表达式以确保它与模式正确匹配。您可以在迭代文本文件时轻松调用此函数。

/**
 * Parse a string of settings which are delimited by equal signs and seperated by white
 * space, and where text strings are escaped by double quotes.
 *  
 * @param  String $string String to parse
 * @return Array          The parsed array of key/values
 */
function parse_options($string){
    // init the parsed option container
    $options = array();

    // search for any combination of word=word or word="anything"
    if(preg_match_all('/(\w+)=(\w+)|(\w+)="(.*)"/', $string, $matches)){
        // if we have at least one match, we walk the resulting array (index 0)
        array_walk_recursive(
            $matches[0], 
            function($item) use (&$options){
                // trim out the " and explode at the =
                list($key, $val) = explode('=', str_replace('"', '', $item));
                $options[$key] = $val;
            }
        );   
    }

    return $options;
}

// test it
$string = 'host=db test="test test" blah=123';

if(!($parsed = parse_options($string))){
    echo "Failed to parse option string: '$string'\n";
} else {
    print_r($parsed);
}

答案 1 :(得分:0)

您可以尝试此PHP版本的shlex扩展名。

https://github.com/zimuyang/php-shlex

示例

<?php

$s = "foo#bar";
$ret = shlex_split($s, true);

var_dump($ret);

?>

上面的示例将输出:

array(1) {
  [0] =>
  string(3) "foo"
}