php dize önde görünüm ile ayrıştırmak

4 Cevap php

PHP bu dizesi vardır:

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

Bunun için ben diziye ayrıştırmak istiyorum:

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

NOT:

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

Bunu yapmanın en etkili yolu nedir?

4 Cevap

Bunu yapmanın daha etkili bir yolu muhtemelen, ama deneyin

$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'nin regex motoru PCRE olduğunu ve ileriye bakmak iddialarını destekler. PCRE'nin, PHP, RegEx'in etrafında Googling, iddialar ve sıfır genişlik iddialar size hiç konu hakkında bilmek istediğiniz daha fazla vermelidir ileriye bakmak.

Düzenli ifadeler bunu yapmak için en iyi yol gibi görünüyor.

<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>

Çıktı:

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'

Fonksiyonu parse_str() tam olarak neye ihtiyacınız yoktur - sadece emin olun, güvenlik nedeniyle ikinci parametre geçmek. Eğer olsa, giriş dizesi çevirmek gerekir:

$string = "name=Shake & Bake&difficulty=easy";
parse_str(str_replace(' & ', '+%26+', $string), $array);

urlencode () & in "Shake & Bake" ve kullanım parse_str ()