我的 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() 时它总是运行数组中的最后一项),您将非常感激。