1

次のような形式の、スペースで区切られたキー => 値のペアを含むファイルを解析しようとしています。

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

通常、このファイルは Python によって取り込まれshlex.split、.preg_splitstrtok

Python に相当する PHP はありshlex.splitますか?

4

2 に答える 2

1

残念ながら、そのような区切り引数をネイティブに処理する組み込みの PHP 関数はありません。ただし、少しの正規表現と少しの配列ウォーキングを使用して、非常に迅速に作成できます。これは単なる例であり、指定したタイプの文字列でのみ機能します。正規表現がパターンに正しく一致することを確認するために、追加の条件を正規表現に追加する必要があります。テキスト ファイルを反復処理するときに、この関数を簡単に呼び出すことができます。

/**
 * 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);
}
于 2013-02-25T20:57:19.533 に答える