2012-04-25 19 views
1

さて、私は数時間インターネットで検索しようとしましたが、これまでのところ役に立たなかったです。PHP regexpで未定義のインデックス通知

Notice: Undefined index: 05 in [redacted_path]\script.php(31) : regexp code on line 1 

このスクリプトは、色としてのものだった:私は、私は(はい、私はそれだけで告知され、スクリプトの実行を停止しません承知しています)、次の予告通知を得続ける理由を把握しようとしていますircのチャンネルログの再配置。私は別のサイトから大きな機能を取得し、私のニーズに合わせて少し修正しました。もちろん、信用はits creatorです。それはさておき、私は正規表現に軽く精通していますが、私が当然間違ったタイプミスやそれに類するものを見つけることはできません。いかなる援助も感謝します。

<?php 
if (isset($_POST['chn'])) { 
    $chn = $_POST['chn']; 
    $str = urldecode($_POST['line']); 
    $filen = "logs/$chn" . "_" . date('Y_F_d') . ".html"; 
    $str = preg_replace('/https?:\/\/[^\s"<>]+/', '<a href="$0" target="_blank">$0</a>', $str); 
    $logln = mirc2html($str) . "<br />\r\n"; 
    $logln = str_replace("Â","",$logln); 
    file_put_contents($filen,stripcslashes($logln),FILE_APPEND); 
} 

if (isset($_GET['test'])) { 
    echo str_replace("Â","",mirc2html($_GET['test'])); 
} 

function mirc2html($x) { 
    $c = array("FFF","000","00007F","009000","FF0000","7F0000","9F009F","FF7F00","FFFF00","00F800","00908F","00FFFF","0000FF","FF00FF","7F7F7F","CFD0CF"); 
    $x = preg_replace("/\x02(.*?)((?=\x02)\x02|$)/", "<b>$1</b>", $x); 
    $x = preg_replace("/\x1F(.*?)((?=\x1F)\x1F|$)/", "<u>$1</u>", $x); 
    $x = preg_replace("/\x1D(.*?)((?=\x1D)\x1D|$)/", "<i>$1</i>", $x); 
    $x = preg_replace("/\x03(\d\d?),(\d\d?)(.*?)(?(?=\x03)|$)/e", "'<span style=\"color: #'.\$c['$1'].'; background-color: #'.\$c['$2'].';\">$3</span>'", $x, -1, $n1); 
    $x = preg_replace("/\x03(\d\d?)(.*?)(?(?=\x03)|$)/e", "'</span><span style=\"color: #'.\$c['$1'].';\">$2</span>'", $x); 
    $x = preg_replace("/\x03|\x0F(.*?)/", "<span style=\"color: #000; background-color: #FFF;\">$1</span>", $x); 
    $x = str_replace("\n","",$x); 
    $x = str_replace("\r","",$x); 
    $x = preg_replace("/\<\/span\>/","",$x,1); 
    $x = preg_replace("/(\<\/span\>){2}/","</span>",$x); 
    return $x; 
} 
?> 

問題のある行はこのようです:

$x = preg_replace("/\x03(\d\d?)(.*?)(?(?=\x03)|$)/e", "'</span><span style=\"color: #'.\$c['$1'].';\">$2</span>'", $x); 
+1

私は正規表現の舞台芸術と呼んでいます。そして、どの行は31行目ですか? – hakre

+0

@hakre Ugh、これを適切にフォーマットすることができないようですが、上記の質問を編集します。 – Daedalus

答えて

3

あなたのエラーの原因が明確である:変数$c['05']が定義されていません。それを定義するか、何らかの理由で私が明らかにしていない整数に変換できる関数を使って置換を変更する - PHPはそのeval'ed正規表現の置き換えができない(通常数値の文字列は整数に変換されるキーは自動的に内部的に)。

あなたはいくつかの提案のために開いている場合:

  • は、重複部分を削除するコードをリファクタリング(それは常に何か、コードの複数のクラスを行い、いくつかのコードですが、各クラスは、それが自身の交換のしています)。
  • 置換をより適切に制御して色の値を渡せるように、置換をコールバック関数で行います。
+2

[少しの実験](http://codepad.org/NGQFk3Z4)は、配列キーの場合、* decimal *整数文字列だけが整数に変換されることを示しています。浮動小数点数も明らかに整数に変換されますが、float-as-stringは文字列として保持されます。あなたは毎日何かを学びます... – DaveRandom

関連する問題