2012-04-25 2 views
1

글쎄, 지금은 몇 시간 동안 인터넷 검색을 시도했지만 지금까지 도움이되지 않았습니다.PHP regexp에서 정의되지 않은 색인 알림

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

이 스크립트는 컬러로 의미했다 : 나는 (그래, 난 그냥 통보하고 스크립트의 실행을 중지하지 않습니다 알고)에게 다음과 같은 사항의 통지를 받고 계속 이유를 알아 내려고 노력하고 있어요 irc 채널 로그를위한 re-placer; 난 다른 사이트에서 큰 기능을 움켜 잡고 약간 필요에 맞게 수정했다. 물론 학점은 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로 대체 할 수 없습니다 (보통 숫자 문자열은 키는 자동으로 내부적으로).

당신은 몇 가지 제안에 대해 열려있는 경우 :

  • 리팩터링 중복 된 부분을 제거하는 코드 (그것은 항상 뭔가 코드의 여러 클래스를 수행하는 코드의 각 클래스는 자신의 교체의있다).
  • 교체를보다 잘 제어하고 색상 값을 전달할 수 있도록 콜백 함수로 교체하십시오.
+2

[약간의 실험] (http://codepad.org/NGQFk3Z4)는 배열 키의 경우 * decimal * 정수 문자열 만 정수로 변환된다는 것을 보여줍니다. float는 정수로도 변환되지만 float-as-string은 문자열로 유지됩니다. 글쎄, 너는 매일 무언가를 배운다 ... – DaveRandom

관련 문제