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) の値にアクセスできるようになりました。

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

これは my*name*is*this として生成されます。一番上にある爆発を使用して簡単に壊すことができます。ハッピーコーディング!

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

これはあなたが探しているものですか?

于 2012-08-23T08:01:11.100 に答える