我的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()时运行数组中的最后一项)你的帮助将非常有用。