1

文字列を受け取り、ドロップダウン リストを作成する関数を作成しようとしています。

文字列の例を次に示します。

Primary[Blue|0000FF,Red|FF0000,Yellow|FFFF00],Secondary[Green|00FF00,Orange|FF9900,Purple|663399],Brown|A52A2A,Silver|C0C0C0

私がこれに変えたいこと:

<select>
<optgroup label="Primary">
<option value="0000FF">Blue</option>
<option value="FF0000">Red</option>
<option value="FFFF00">Yellow</option>
</optgroup>
<optgroup label="Secondary">
<option value="00FF00">Green</option>
<option value="FF9900">Orange</option>
<option value="663399">Purple</option>
</optgroup>
<option value="A52A2A">Brown</option>
<option value="C0C0C0">Silver</option>
</select>

私は文字列を次のようなものに変換しようとしています:

[0] => Primary
[0][0] => Blue|0000FF
[0][1] => Red|FF0000
[0][2] => Yellow|FFFF00
[1] => Secondary
[1][0] => Green|00FF00
[1][1] => Orange|FF9900
[1][2] => Purple|663399
[2]
[2][0] => Brown|A52A2A
[3]
[3][0] => Silver|C0C0C0

最初の文字列を分割する方法がわかりません。私は爆発とpreg_splitを試みましたが、どちらも必要な場所で分割していないようです。

4

2 に答える 2

2

どのようにしてこの文字列にたどり着いたのかわかりません。検討するようアドバイスしますjson_decodejson_encode

現在の形式では、次を使用できます。

$string = 'Primary[Blue|0000FF,Red|FF0000,Yellow|FFFF00],Secondary[Green|00FF00,Orange|FF9900,Purple|663399],Brown|A52A2A,Silver|C0C0C0';
preg_match_all("/([a-z]+)(\[([a-z0-9|,]+)\])|([a-z0-9|,]+)$/i", $string, $m);

printf("<select>");
for($i = 0; $i < count($m[1]); $i ++) {
    if (! empty($m[1][$i])) {
        printf("\n\t<optgroup label=\"%s\">", $m[1][$i]);
        foreach ( array_filter(explode(",", $m[3][$i])) as $var ) {
            list($color, $hex) = explode("|", $var);
            printf("\n\t\t<option value=\"%s\">%s</option>", $hex, $color);
        }
        printf("\n\t</optgroup>");
    }
}
foreach ( array_filter(explode(",", $m[4][2])) as $var ) {
    list($color, $hex) = explode("|", $var);
    printf("\n\t<option value=\"%s\">%s</option>", $hex, $color);
}
printf("\n</select>");

出力

<select>
    <optgroup label="Primary">
        <option value="0000FF">Blue</option>
        <option value="FF0000">Red</option>
        <option value="FFFF00">Yellow</option>
    </optgroup>
    <optgroup label="Secondary">
        <option value="00FF00">Green</option>
        <option value="FF9900">Orange</option>
        <option value="663399">Purple</option>
    </optgroup>
    <option value="A52A2A">Brown</option>
    <option value="C0C0C0">Silver</option>
</select>
于 2012-12-05T20:09:03.697 に答える
0

この正規表現で分割を試みることができます: (?![^\[]+\]),.

そこから、文字列に が含まれているかどうかを確認します[]

$array = preg_split('/(?![^\[]+\]),/', $string);

$return = array();

foreach($array as $val){
    if(preg_match('/(.*)\[(.*)\]/', $val, $match) === 1){
        $return[$match[1]] = explode(',', $match[2]);
    }
    else{
        $return[] = $val;
    }
}

デモ: http://ideone.com/BM0ewX

于 2012-12-05T20:17:37.113 に答える