5

アイデアは、次の文字列から値を取得することです。

String: Server has [cpu]4[cpu] cores and [ram]16gb[ram]

タグの値とタグの間にあるものを動的に取得する必要があります: 間にあるものは関係ありません[*]*[*]

出力: 次のような配列である必要があります

Array(
    'cpu' => 4,
    'ram' => '16gb'
)

正規表現パターンに多くの問題があります。どんな助けでも大歓迎です。

編集: タグ間の値またはタグ自体は、英数字または数字のいずれかです。

サンプル文字列はサンプルのみです。タグは無制限に出現する可能性があるため、手動ではなく、その場で配列を設定する必要があります。

4

4 に答える 4

1
$string = '[cpu]4[cpu] cores and [ram]16gb[ram]';

preg_match('|\[([^\]]+)\]([^\[]+)\[/?[^\]]+\][^\[]+\[([^\]]+)\]([^\[]+)\[/?[^\]]+\]|', $string, $matches);
$array = array($matches[1] => $matches[2], $matches[3] => $matches[4]);

print_r($array);
于 2012-11-19T06:14:52.083 に答える
1

作業コード、walkerneoのわずかに変更されたバージョン:

他の人は私のコードに基づいて構築したり、より良いことを提案したりできます。

<pre><?php
    $string = "Server has [cpu]4[cpu] cores and [ram]16gb[ram] and [memory]2tb[/memory]";
    $matches = array();
    $pattern = '/\[(\w+)\]([^\[\]]+)\[\/?\w+\]/';
    preg_match_all($pattern, $string, $matches);
    $output = array_combine($matches[1], $matches[2]);
    var_dump($output);
?></pre>

フィドル: http://phpfiddle.org/main/code/n1i-e1p

于 2012-11-19T06:15:06.010 に答える
0

複数のpreg_matchの使用が許可されている場合、これは解決策になる可能性があります。

    $str = '[cpu]4[cpu] cores and [ram]16gb[ram][hdd]1TB[hdd]asdaddtgg[vga]2gb[vga]';
    $arrResult = array();
    preg_match_all('/(\[[A-Za-z0-9]+\][A-Za-z0-9]+\[[A-Za-z0-9]+\])/i', $str, $match,PREG_SET_ORDER);
    if (is_array($match)) {
        foreach ($match as $tmp) {
            if (preg_match('/\[([A-Za-z0-9]+)\]([A-Za-z0-9]+)\[([A-Za-z0-9]+)\]/', $tmp[0], $matchkey)) {
                $arrResult[$matchkey[1]] = $matchkey[2];
            }
        }
    }

    var_dump($arrResult);

結果:

array(4) {
  'cpu' =>
  string(1) "4"
  'ram' =>
  string(4) "16gb"
  'hdd' =>
  string(3) "1TB"
  'vga' =>
  string(3) "2gb"
}
于 2012-11-19T06:45:02.397 に答える