我正在尝试解析包含空格分隔的键=>值对的文件,格式如下:
host=db test="test test" blah=123
通常,此文件由 Python 摄取并使用 解析shlex.split
,但我一直无法找到 PHP 等效项,并且我尝试将其逻辑化preg_split
或strtok
效率不高。
是否有与 Python 等效的 PHP shlex.split
?
不幸的是,没有内置的 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);
}
你可以试试这个 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"
}