preg_replace パーサーに問題があり、何が間違っていたのかわかりません。現時点では、パーサーは html を実行して置換し、機能を実行しますが、問題が 1 つあります。データベースから送信されたデータに関係なく、最後の関数が常に実行されます。私はこれと数週間戦ってきましたが、何が欠けているのかよくわかりません。これは私が得ているエラーです:
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 の機能、特にある機能から別の機能への出力方法に関するより良いドキュメントが PHP にあればいいのにと思います。以前のエラー (changelike() が導入されたときに常に配列の最後の項目が実行された理由) に光を当てることができる人がいれば、あなたの助けが大いに役立つでしょう。