2010-05-25 11 views
0

내 사이트에서 출력 버퍼링을 사용하여 모든 출력을 가져온 다음 브라우저로 보내기 전에 프로세스 기능을 통해 실행합니다 (아무것도 바꾸지 않고 관리가 용이 ​​한 부분으로 나누기 만 함). 이 특별한 경우에는 데이터베이스에있는 모든 국가 (약 240 개국)의 레이블을 나열하기 때문에 많은 양의 출력이 있습니다. 문제는 전체적으로 preg_match 함수가 건너 뛰게되는 것입니다. 아무 것도하지 않고 일치하는 항목을 반환하지 않습니다. 그러나 레이블의 일부 (특정 부분이 없으며 문자를 줄이기위한 임의의 부분)를 제거하면 preg_match 함수가 다시 작동합니다. 제가 레이블에서 제거한 것이 중요하지 않은 것처럼 보입니다. 그렇게 많은 문자를 제거하는 한 것 같습니다. preg 기능이 처리 할 수있는 부분에 모자가 있습니까? 아니면 너무 많은 데이터를 검사해야 할 경우 시간이 초과됩니까?preg 기능의 최대 글자 수 제한은 무엇입니까?

편집 : 다음은 실행되는 기능입니다.

public function boom($data) { 
    $number = preg_match_all("/(<!-- ([\w]+):start -->)\n?(.*?)\n?(<!-- \\2:stop -->)/s", $data, $matches, PREG_SET_ORDER); 
    if ($number == 0) $data = array("content" => $data); 
    else unset($data); 
    foreach ($matches as $item): 
     //$item[3] = preg_replace("/\n/", "", $item[3], 1); 
     if (preg_match("/<!-- breaker -->/s", $item[3])) $data[$item[2]] = explode("<!-- breaker -->", $item[3]); 
     else $data[$item[2]] = $item[3]; 
    endforeach; 
    //die(var_dump($data)); 
    return $data; 
} 

다음은 페이지로 전송되는 처리되지 않은 출력입니다. 나는 그것이 변수에서 0 일치를 반환하는 시작 부분에 preg_match_all이라고 결정 했으므로 함수는 단순히받은 전체 문자열을 $data['content']에 던지고 다른 모든 것을 건너 뛰는 것입니다.

http://pastebin.com/iGfM6gxx

나는 아무것도 작동하는 것 같다되지 함께 붕괴, 새로운 라인에 라벨을 넣어 시도했습니다. 그러나 위에서 설명한대로 임의의 조각을 제거하면 정상적으로 진행됩니다. 이 기능은 정상 길이의 모든 페이지마다 완벽하게 작동합니다.

답변

0

당신의 정규식과 데이터를 보지 않고 말하지만, (http://www.php.net/manual/en/pcre.configuration.php)

+0

내가 출력과 기능을 가진 내 질문에 업데이트 한 pcre.backtrack_limit/pcre.recursion_limit을 변경하려고 어렵다. – animuson

+0

나는 테스트를 거쳤으며, 저에게 잘 맞습니다 (PHP 5.3). 하지만, 어쨌든 "/ () \ n? | \ n? ()/s "대신. –

+0

글쎄, 왜 그것이 나를 위해 일하지 않는지 미스테리 일 것 같다. 수정 해 주셔서 감사합니다. 나는 이미 시스템에 구현되어있는 간단한 해결 방법을 발견 했으므로 내 부분에 추가 코딩이 필요하지 않았습니다. 방금 처리 된 것처럼 수동으로 두 개의 개별 조각을 배열에 저장했습니다. – animuson