0

私はこのような多くの行を持つテキストを持っています:

(item (Index Value) (Name Value)(Name2 Value2)(Name3 Value3) (Speciality (Name-a value-a)  (Name-b value-b))

実際の例:

(item(name 256)(Index 1)(Image "Wea001")(Action 1 1)(class weapon sword)(code 1 1 1 1)(country 2)(level 1)(wear 1)   (limit Knight 1)(range 16)(buy 4)(sell 1)(endurance 4)(specialty(aspeed 700)(Attack 3 10)(hit 15)))

今、私はそれらを配列 $Items[$Index] に保存したい -インデックス値は行の (Index XX) です-

そして、各値の新しい配列には、たとえば(実際の行を使用して)これに値が含まれます

$Items[1]{
$Name => 256,
$Image => 'Wea001',
$Action=> '1 1',
$class => 'weapon sword',
...etc
}

私はすでに爆発を使用してそれらをマスター配列に保存しましたが、行のインデックスではなくデフォルト値0、1、2、3、..などを使用しました

$items = explode('<br />', $inititemcontent);
for($i = 0; $i < count($items); $i++){
    echo "$items[$i] <br />";
}

PS: インデックス値が繰り返されることはありません。同じインデックスを持つ 2 つの行が存在することはありません PPS: 通常、すべての小さなタグ (名前値) が存在するわけではありません。

4

2 に答える 2

1

このようなものは機能しますか?この例には 1 行しかないので、あまり詳しく説明する必要はありませんでした。

<?php
    $string = '(item(name 256)(Index 1)(Image "Wea001")(Action 1 1)(class weapon sword)(code 1 1 1 1)(country 2)(level 1)(wear 1)   (limit Knight 1)(range 16)(buy 4)(sell 1)(endurance 4)(specialty(aspeed 700)(Attack 3 10)(hit 15)))';

    preg_match_all('!\([^()]+\)!s',$string,$parts);

    $items = array();


    foreach($parts as $index=>$temp_array){
        foreach($parts[$index] as $key=>$component){
            $component = preg_replace('![()]!','',$component);
            preg_match_all('!([^ ]+) ([^)]+)!',$component,$component_parts);

            $temp_key = $component_parts[1][0];
            $temp_val = $component_parts[2][0];
            $items[$index][$temp_key]=$temp_val;
        }
    }

    print_r($items);

?>

出力は次のようになります。

Array
(
[0] => Array
    (
        [name] => 256
        [Index] => 1
        [Image] => "Wea001"
        [Action] => 1 1
        [class] => weapon sword
        [code] => 1 1 1 1
        [country] => 2
        [level] => 1
        [wear] => 1
        [limit] => Knight 1
        [range] => 16
        [buy] => 4
        [sell] => 1
        [endurance] => 4
        [aspeed] => 700
        [Attack] => 3 10
        [hit] => 15
    )

)
于 2013-03-27T22:46:44.190 に答える
0

最初の回答を書いた後、元のファイルの形式が JSON に似ていることに気付いたので、次のように書きました。

    <?php
    $string = '(item(name 256)(Index 1)(Image "Wea001")(Action 1 1)(class weapon sword)(code 1 1 1 1)(country 2)(level 1)(wear 1)   (limit Knight 1)(range 16)(buy 4)(sell 1)(endurance 4)(specialty(aspeed 700)(Attack 3 10)(hit 15)))';



    $patterns = array(
    '!\(!',
    '!\)!',
    '!\{([^\{}]+)\{!',
    '!\},\},\}!',
    '!\},([^}])!',
    '!\{([^ ]+) ([^}]+)\}!',
    '!"!',
    "!'!",
    "!\}(,)?!",
    "!\},$!",
    );
    $replacements = array(
    "{",
    "},",
    "{\"$1':[\n{'",
    "}]}]}",
    "},\n$1",
    "{'$1':'$2'}",
    '',
    '"',
    "}$1\n",
    "}"
    );

    $string = preg_replace($patterns,$replacements,$string);
    //print $string;
    $items = json_decode($string,true);

    print_r($items);

    ?>

出力ソースは次のようになります。

Array
    (
        [item] => Array
            (
                [0] => Array
                    (
                        [name] => 256
                    )

                [1] => Array
                    (
                        [Index] => 1
                    )

                [2] => Array
                    (
                        [Image] => Wea001
                    )

                [3] => Array
                    (
                        [Action] => 1 1
                    )

                [4] => Array
                    (
                        [class] => weapon sword
                    )

                [5] => Array
                    (
                        [code] => 1 1 1 1
                    )

                [6] => Array
                    (
                        [country] => 2
                    )

                [7] => Array
                    (
                        [level] => 1
                    )

                [8] => Array
                    (
                        [wear] => 1
                    )

                [9] => Array
                    (
                        [limit] => Knight 1
                    )

                [10] => Array
                    (
                        [range] => 16
                    )

                [11] => Array
                    (
                        [buy] => 4
                    )

                [12] => Array
                    (
                        [sell] => 1
                    )

                [13] => Array
                    (
                        [endurance] => 4
                    )

                [14] => Array
                    (
                        [specialty] => Array
                            (
                                [0] => Array
                                    (
                                        [aspeed] => 700
                                    )

                                [1] => Array
                                    (
                                        [Attack] => 3 10
                                    )

                                [2] => Array
                                    (
                                        [hit] => 15
                                    )

                            )

                    )

            )

    )
于 2013-03-28T02:40:36.117 に答える