PHP中的基于标记的解析器拒绝向函数发送值

时间:2013-09-02 04:36:43

标签: php parsing

我的preg_replace解析器出了问题,我无法弄清楚我做错了什么。目前,解析器将运行并替换html并按照预期运行函数,一次打嗝。无论从数据库提交的数据如何,都将始终运行最后一个函数。我已经和它斗争了几个星期了,而且我不太确定我错过了什么。这是我得到的错误:

Notice: Undefined index: \1 in ...\pgame.php on line 69

第69行只是指提交测试与会话中的值的行。现在,所有帐户的此代码都应尚未运行,但它正在运行并发送有关值\ 1的通知,它不应该首先发送给它。这是正在运行的功能:

66 function changelike($charac, $val){
67  //check the state of character
68  global $con, $player, $valarr;
69  $test = $_SESSION[$charac];
70  if($test == -1){
71      //if at -1, set to 50
72      $test = 50;
73  }
74  $test += $val;
75  $valarr[0] = 1;
76  $valarr[1] = $test;
77  $valarr[2] = $charac;
78  
79  }

这是解析器,它是引用的脚本中唯一的位置:

function scenerender ($string) {
$playername=$_SESSION['name'];
$search = array(
    '#[[]comp l\=(.*?) t\=(.*?)[]](.*?)[[]/comp[]]#',
    '#[[]lopen[]]#',
    '#[[]lclose[]]#',
    '#[[]nl[]]#',
    '#[[]pn[]]#',
    '#[[]name\=(.*?)[]]#',
    '#[[]lmenuopen[]]#',
    '#[[]lmenuclose[]]#',
    '#[[]lperson\=(.*?)[]]#',
    '#[[]cperson\=(.*?)[]]#',
    '#[[]rperson\=(.*?)[]]#',
    '#[[]lobj\=(.*?)[]](.*?)[[]\/lobj[]]#',
    '#[[]img[]](.*?)[[]\/img[]]#',
    '#[[]button\=(.*?)[]](.*?)[[]\/button[]]#',
    '#[[]rspc\ =[[](.*?)[]] =[[](.*?)[]] =[[](.*?)[]] =[[](.*?)[]] =[[](.*?)[]] =[[](.*?)[]] =[[](.*?)[]] =[[](.*?)[]] =[[](.*?)[]] =[[](.*?)[]][]](.*?)[[]\/rspc[]]#',
    '#[[]wavsound\=(.*?)[]]#',
    '#[[]mp3sound\=(.*?)[]]#',
    '#[[]oogsound\=(.*?)[]]#',
    '#[[]moodmod\=(.*?) n=(.*?)[]]#'
);
$replace = array(
    '<a href=\'mail.html\' target=\'_blank\'><img src=\'\\3\' style=\'position:absolute;top:\\2;left:\\1\'></a>',
    '<map name=\'doormap\'>',
    '</map>',
    '<br>',
    $playername,
    '<h2 style=\'color: rgb(255, 255, 255);position:absolute;top:285;font-size:165%;\'>\\1</h2>',
    '<img src=\'gui/speechbox.png\' id=\'textfill\'><div id=\'text\'><center style=\'font-size:105%;font-weight:bold;\'>',
    '</center></div>',
    '<img src=\'\\1\' style=\'position:absolute;bottom:0px;left:10px;\'>',
    '<img src=\'\\1\' style=\'position:absolute;bottom:0px;left:101px;\'>',
    '<img src=\'\\1\' style=\'position:absolute;bottom:0px;left:191px;\'>',
    '<area shape=\'polygon\' coords=\'\\2\' onclick=\'loadbyref(\\1)\' href=\'#none\'>',
    '<img src=\'\\1\' usemap=\'\#doormap\'>',
    '<button onclick=\'loadbyref(\\1)\'>\\2</button>',
    randspeach( '\\1', '\\2', '\\3', '\\4', '\\5', '\\6', '\\7', '\\8', '\\9', '\\10'),
    canplaysound('<audio autoplay><source id=\'plc\' src=\'\\1\' type=\'audio/wav\'></audio>'),
    canplaysound('<audio autoplay><source id=\'plc\' src=\'\\1\' type=\'audio/mp3\'></audio>'),
    canplaysound('<audio autoplay><source id=\'plc\' src=\'\\1\' type=\'audio/oog\'></audio>'),
    changelike(' \\1', '\\2')
);
return preg_replace($search, $replace, $string);
}

这应该做的是查询会话以获取变量charac引用的值,但即使从它的正确标记调用它,它也不会传输由// 1和// 2引用的值。相反,它传递/ 1。

我错过了重要的事情吗?任何关于这个问题的帮助,甚至是正确指导如何正确发送价值并做到这一点的人都会非常感激。

更新

我已经使用了preg_replace_callback()。我真的希望PHP有一些关于它的功能的更好的文档,特别是它如何从一个函数输出到另一个函数。 如果有人能够解释之前的错误(为什么它总是在引入changelike()时运行数组中的最后一项)你的帮助将非常有用。

0 个答案:

没有答案