我在PHP中有这个字符串:
$string = "name=Shake & Bake&difficulty=easy";
我要解析为数组:
Array
(
[name] => Shake & Bake
[difficulty] => easy
)
NOT:
Array
(
[name] => Shake
[difficulty] => easy
)
最有效的方法是什么?
答案 0 :(得分:4)
这可能是一种更有效的方法,但请尝试
$foo = 'name=Shake & Bake&difficulty=easy';
$pairs = preg_split('{&(?=[^\s])}',$foo);
//$pairs = preg_split('/&(?=[^\s])/',$foo); //equivalent, using different delimiters.
//$pairs = preg_split('%&(?=[^\s])%',$foo); //equivalent, using different delimiters.
$done = Array();
foreach($pairs as $keyvalue){
$parts = preg_split('{=}',$keyvalue);
$done[$parts[0]] = $parts[1];
}
print_r($done);
PHP的正则表达式引擎是PCRE,它支持向前看断言。在PCRE,PHP,RegEx上搜索,预测断言和零宽度断言应该比你想知道的更多。
答案 1 :(得分:3)
正则表达式似乎是最好的方法。
<html>
<head>
<title>Test params</title>
</head>
<body>
<?php
test_build('a=b');
test_build('blah=foo&foo=foo2');
test_build('blah=foo&foo&foo2=foo3&foo');
function test_build($string) {
echo "<p>Testing: $string</p>\n";
$params = build_params($string);
if ($params) {
echo "<ul>\n";
foreach ($params as $k => $v) {
echo "<li>'$k' => '$v'</li>\n";
}
echo "</ul>\n";
} else {
echo "<p>Found no parameters.</p>\n";
}
}
function build_params($string) {
preg_match_all('!([^=&]+)=([^=]*)(?=(&|$))!', $string, $matches);
$ret = array();
for ($i=0; $i<sizeof($matches[1]); $i++) {
$ret[$matches[1][$i]] = $matches[2][$i];
}
return $ret;
}
?>
</body>
</html>
输出:
Testing: a=b
* 'a' => 'b'
Testing: blah=foo&foo=foo2
* 'blah' => 'foo'
* 'foo' => 'foo2'
Testing: blah=foo&foo&foo2=foo3&foo
* 'blah' => 'foo&foo'
* 'foo2' => 'foo3&foo'
答案 2 :(得分:1)
<?php $pattern ='/([^&]+)=([^=]+)(?=$|&[^=]+=)/';生成
$test = array( 'name=Shake & Bake&difficulty=easy', 'name=Shake&Bake&difficulty=easy', 'difficulty=easy&name=Shake & Bake', 'difficulty=easy&name=Shake&Bake', 'name=Shake&Bake', 'difficulty=easy', 'name=Shake&Bake&foo&difficulty=easy', 'name=Shake&Bake&difficulty=easy&', 'name=Shake&Bake&difficulty=' ); foreach($test as $foo) { preg_match_all($pattern, $foo, $m); echo $foo, "\n"; for($i=0; $i<count($m[0]); $i++) { echo ' ', $m[1][$i], ' =$gt; "', $m[2][$i], "\"\n"; } echo "\n"; } ?>
name=Shake & Bake&difficulty=easy name => "Shake & Bake" difficulty => "easy"似乎正常工作(除了难度=在上一个示例中未匹配)。
name=Shake&Bake&difficulty=easy name => "Shake&Bake" difficulty => "easy"
difficulty=easy&name=Shake & Bake difficulty => "easy" name => "Shake & Bake"
difficulty=easy&name=Shake&Bake difficulty => "easy" name => "Shake&Bake"
name=Shake&Bake name => "Shake&Bake"
difficulty=easy difficulty => "easy"
name=Shake&Bake&foo&difficulty=easy name => "Shake&Bake&foo" difficulty => "easy"
name=Shake&Bake&difficulty=easy& name => "Shake&Bake" difficulty => "easy&"
name=Shake&Bake&difficulty= name => "Shake&Bake"
答案 3 :(得分:0)
函数parse_str()完全符合您的需要 - 只需确保您出于明显的安全原因传递第二个参数。但是,您需要翻译输入字符串:
$string = "name=Shake & Bake&difficulty=easy";
parse_str(str_replace(' & ', '+%26+', $string), $array);
答案 4 :(得分:-1)
urlencode()&amp;在“Shake&amp; Bake”中使用parse_str()