0

次のようなテキストから:

category=[123,456,789], subcategories, id=579, not_in_category=[111,333]

次のようなものを取得するには、正規表現が必要です。

$params[category][0] = 123;
$params[category][1] = 456;
$params[category][2] = 789;
$params[subcategories] = ; // I just need to know that this exists
$params[id] = 579;
$params[not_category][0] = 111;
$params[not_category][1] = 333;

助けてくれてありがとう。

PS

ご提案のとおり、構造とアイテムの数が変更される可能性があることを明確にします。基本的に構造は次のとおりです。

key=value, key=value, key=value, ...

値は次のとおりです。

  • 単一の値 (category=123またはpostID=123またはmykey=myvalueなど)
  • 「配列」 (例: category=[123,456,789])
  • TRUE 値が配列に「キー」が存在するという事実からの仮定である「ブール値」(例subcategories)
4

4 に答える 4

2

この方法は十分に柔軟である必要があります。

$str = 'category=[123,456,789], subcategories, id=579, not_in_category=[111,333]';
$str = preg_replace('#,([^0-9 ])#',', $1',$str); //fix for string format with no spaces (count=10,paginate,body_length=300)
preg_match_all('#(.+?)(,[^0-9]|$)#',$str,$sections); //get each section
$params = array();
foreach($sections[1] as $param)
{
    list($key,$val) = explode('=',$param); //Put either side of the "=" into variables $key and $val
    if(!is_null($val) && preg_match('#\[([0-9,]+)\]#',$val,$match)>0)
    {
        $val = explode(',',$match[1]); //turn the comma separated numbers into an array
    }
    $params[$key] = is_null($val) ? '' : $val;//Use blank string instead of NULL
}
echo '<pre>'.print_r($params,true).'</pre>';
var_dump(isset($params['subcategories']));

出力:

Array
(
    [category] => Array
        (
            [0] => 123
            [1] => 456
            [2] => 789
        )

    [subcategories] => 
    [id] => 579
    [not_in_category] => Array
        (
            [0] => 111
            [1] => 333
        )

)

bool(true) 

代替 (処理前に文字列操作なし):

$str = 'count=10,paginate,body_length=300,rawr=[1,2,3]';
preg_match_all('#(.+?)(,([^0-9,])|$)#',$str,$sections); //get each section
$params = array();
foreach($sections[1] as $k => $param)
{
    list($key,$val) = explode('=',$param); //Put either side of the "=" into variables $key and $val
    $key = isset($sections[3][$k-1]) ? trim($sections[3][$k-1]).$key : $key; //Fetch first character stolen by previous match
    if(!is_null($val) && preg_match('#\[([0-9,]+)\]#',$val,$match)>0)
    {
        $val = explode(',',$match[1]); //turn the comma separated numbers into an array
    }
    $params[$key] = is_null($val) ? '' : $val;//Use blank string instead of NULL
}
echo '<pre>'.print_r($params,true).'</pre>';

別の代替手段: 安全のためのプロセスの前に文字列を完全に再フォーマットする

$str = 'count=10,paginate,body_length=300,rawr=[1, 2,3] , name = mike';
$str = preg_replace(array('#\s+#','#,([^0-9 ])#'),array('',', $1'),$str); //fix for varying string formats
preg_match_all('#(.+?)(,[^0-9]|$)#',$str,$sections); //get each section
$params = array();
foreach($sections[1] as $param)
{
    list($key,$val) = explode('=',$param); //Put either side of the "=" into variables $key and $val
    if(!is_null($val) && preg_match('#\[([0-9,]+)\]#',$val,$match)>0)
    {
        $val = explode(',',$match[1]); //turn the comma separated numbers into an array
    }
    $params[$key] = is_null($val) ? '' : $val;//Use blank string instead of NULL
}
echo '<pre>'.print_r($params,true).'</pre>';
于 2013-08-12T11:39:47.423 に答える
0

JSON も使用できます。これは PHP でネイティブです: http://php.net/manual/fr/ref.json.php

もっと簡単になります;)

于 2013-08-12T11:16:24.707 に答える
0
$str = 'category=[123,456,789], subcategories, id=579, not_in_category=[111,333]';
$main_arr = preg_split('/(,\s)+/', $str);
$params = array();
foreach( $main_arr as $value) {
    $pos = strpos($value, '=');
    if($pos === false) {
        $params[$value] = null;
    } else {
        $index_part = substr($value, 0, $pos);
        $value_part = substr($value, $pos+1, strlen($value));
        $match = preg_match('/\[(.*?)\]/', $value_part,$xarr);
        if($match) {
            $inner_arr = preg_split('/(,)+/', $xarr[1]);
            foreach($inner_arr as $v) {
                $params[$index_part][] = $v;
            }
        } else {
            $params[$index_part] = $value_part;
        }

    }
}

print_r( $params );

出力:

Array
(
    [category] => Array
        (
            [0] => 123
            [1] => 456
            [2] => 789
        )

    [subcategories] => 
    [id] => 579
    [not_in_category] => Array
        (
            [0] => 111
            [1] => 333
        )

)
于 2013-08-12T11:45:08.867 に答える