如何将分号分隔的字符串放入数组?

时间:2012-08-23 07:58:09

标签: php csv explode

好吧,我只是想知道如何将这个以分号分隔的字符串放入数组

one,two,three; four,five,six; if( i < x { "seven,eight"; } if( x < i ) { nine; }

我需要的结果是

[0] => one,two,three
[1] => four,five,six
[2] => if( i < x { "seven,eight"; } if( x < i ) { nine; }

我知道如何分解这些分离的值,但我陷入了这个

if( i < x { "seven,eight"; } if( x < i ) { nine; }

原始数据是

bonus2 bAddRace,RC_DemiHuman,80; bonus2 bIgnoreDefRate,RC_DemiHuman,30; if(getrefine()>=6) { bonus2 bAddRace,RC_DemiHuman,40; } if(getrefine()>=9) {  autobonus2 "{ bonus bShortWeaponDamageReturn,20; bonus bMagicDamageReturn,20; }",200,1000,BF_WEAPON,"{ specialeffect2 EF_REFLECTSHIELD; }"; }

到目前为止,我尝试过的代码是

function build_item_script_options( $data = array() )
{
    $html = "";
    $bonus_txt = "";
    $bonus_opts = "";
    $bonus_opts_array = array();

    $script = explode( ";", $data['script'] );
    for( $i = 0; $i <= count( $script ) - 1; $i++ )
    {
        if( strtolower( substr( $script[$i], 0, 5 ) ) == 'bonus' )
        {
            $bonus = explode( ',', $script[$i] );
            for( $k = 1; $k <= $bonus[$i] - 1; $k++ )
            {
                array_push( $bonus_opts_array, $bonus[$i][$k] );
            }
            $bonus_txt = $bonus[0];
            $bonus_opts = implode( ',', $bonus_opts_array );
        }
        else
        {
            $bonus_txt = $script[$i];
        }

        $html .= "<option opts=\"" . $bonus_opts . "\" value=\"" . $bonus_txt . "\" selected=selected>" . $bonus_txt . "</option>";
    }

    return $html;
}

4 个答案:

答案 0 :(得分:1)

你不能通过简单地使用;进行爆炸 - 你想要做什么似乎很像解析一个语言,你需要一个具有智能的实际语言解析器,所以它可以决定是否;属于第一级,或者属于其他不需要爆炸的功能。

你可以,例如计算沿着字符串移动时遇到的括号数量,如果在没有打开括号时发生;,则只会爆炸。

一些伪代码:

function explode_context_sensitive(string str) {
    int open_brackets = 0, last_semicolon = 0;
    string[] result = new string[];
    for (int idx = 0; idx < strlen(str); idx++) {
        if (str[idx] == ";" && open_brackets == 0) {
            result[] = substr(str, last_semicolon, idx);
            last_semicolon = idx;
        }
        else if (str[idx] == "(")
            ++open_brackets;
        else if (str[idx] == ")")
            --open_brackets;
    }
    return result;
}

您需要扩展这样的方法以满足您的需求,可能会计算不同类型的括号或处理不合适的括号......

简而言之:如果你想做到这一点,你就需要做很多工作。如果您不想重新创建该语言的整个语法,则上下文敏感的语言解析非常困难。

答案 1 :(得分:0)

这是你需要的吗?

$str = 'one,two,three; four,five,six; if( i < x { "seven,eight"; } if( x < i ) { nine; }';
$str = explode("; ", $str, 3);
print_r($str);

示例:

  

http://codepad.org/fqKMTUcp

** 编辑 **

你也可以试试这个:

$open_brackets = '0';
$string = '';
$str = 'one,two,three; four,five,six; if( i < x { "seven,eight"; } if( x < i ) { nine; }';
$split = str_split($str);
foreach($split as $bracket){
$string .= $bracket;
if($open_brackets == '0' && $bracket == ';'){
$string = substr_replace($string, "*", -1);
}
if($bracket == '{'){
$open_brackets++;
}
if($bracket == '}'){
$open_brackets--;
}
}
$string = explode('* ', $string);
print_r($string);

示例:

  

http://codepad.org/uO9sGnDz

答案 2 :(得分:0)

使用*或其他一些不带分号的特殊字符,因为它有时可能会发生冲突,因为php识别它是一个声明破坏者。 试试这个:

$value = explode('*',$arr);

现在您可以通过$ value [0],$ value [1]等访问数组(arr)值。 你也必须在内爆时使用这个:

$arr = implode('*',my,name,is,this);

这将产生我的*名*是*这个。 你可以通过使用顶部的爆炸来简单地打破它。 快乐的编码!

答案 3 :(得分:-1)

[2] => ( i < x ) ? "seven,eight":  "nine";

这是你在找什么?