PHP:拆分复杂字符串

PHP:拆分复杂字符串,php,regex,Php,Regex,我正在尝试编写一个函数,它将接受一个字符串并创建一个下拉列表 下面是一个示例字符串: 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"

我正在尝试编写一个函数,它将接受一个字符串并创建一个下拉列表

下面是一个示例字符串:

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>

我不知道如何分割初始字符串。我尝试了爆炸和PrggS分裂,但似乎都不在我需要的地方分裂。

< P>不知道你是如何结束这个字符串的,我建议你考虑<代码> JSONY-DECODE < /COD>和<代码> JSONYNECOND/<代码>

对于当前格式,您可以使用:

$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>");
$string='初级[蓝色| 0000FF,红色| FF0000,黄色| FFFF00],次级[绿色| 00FF00,橙色| FF9900,紫色| 663399],棕色| A52A2A,银色| C0C0';
preg_match_all(“/([a-z]+)(\[([a-z0-9 |,]+)\]))|([a-z0-9 |,]+)$/i“,$string,$m);
printf(“”);
对于($i=0;$i
输出

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

蓝色
红色
黄色的
绿色
橙色
紫色
棕色的
银币
您可以尝试在以下位置进行拆分:
(?![^\[]+\]),

然后,从那里查看字符串是否包含
[]

$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;
    }
}

演示:

您的字符串的模式不一致。可能只是使用json语法?
explode('],“,$string)
将得到一个数组,其中包含
[0]=>“Primary[Blue | 0000FF,Red | FF0000,Yellow | ff00”、[1]=>“Secondary[Green | 00FF00,Orange | FF9900,Purple | 663399”、[2]=>“Brown | a52a,Silver | c0”
从这里开始,您可以在“[”上分解每一个,然后在“,”上分解结果
$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;
    }
}