0

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

4

0 回答 0