2

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

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

4 回答 4

1

这是你需要的吗?

$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

于 2012-08-23T08:06:04.510 回答
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;
}

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

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

于 2012-08-23T08:06:46.587 回答
0

使用 * 或其他一些特殊字符而不是分号,因为有时它可能会发生冲突,因为 php 识别为语句中断。试试这个 :

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

现在您可以通过 $value[0],$value[1] 等访问您的数组(arr)值。您还必须在 implode 时使用:

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

这将产生 my*name*is*this。您可以使用顶部的 explode 来简单地破坏它。快乐编码!

于 2012-08-23T08:08:42.327 回答
-1
[2] => ( i < x ) ? "seven,eight":  "nine";

这是你想要的?

于 2012-08-23T08:01:11.100 回答