php字符串解析与展望未来

时间:2009-04-28 23:06:01

标签: php string

我在PHP中有这个字符串:

$string = "name=Shake & Bake&difficulty=easy";

我要解析为数组:

Array
(
    [name] => Shake & Bake 
    [difficulty] => easy
) 

NOT:

Array
(
    [name] => Shake
    [difficulty] => easy
) 

最有效的方法是什么?

5 个答案:

答案 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()