好吧,我只是想知道如何将这个以分号分隔的字符串放入数组
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;
}
答案 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);
示例:
** 编辑 **
你也可以试试这个:
$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);
示例:
答案 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";
这是你在找什么?