2010-07-16 4 views
0

내 preg_match_all 문에 문제가 있습니다. 기사를 타이핑 할 때 완벽하게 작동하지만 일정 시간이 지난 후에 갑자기 모든 것이 함께 작동하지 않습니다. 이것은 많은 기능을 수행 한 후에 무엇이든지의 기능을 가진 알려진 문제입니까?preg_match_all이 너무 많은 문자 뒤에 나오는 이유는 무엇입니까?

$number = preg_match_all("/(<!-- ([\w]+):start -->)\n?(.*?)\n?(<!-- \\2:stop -->)/s", $data, $matches, PREG_SET_ORDER); 

는 그 기사에 대한 작업 중지, 모든 시간을 잘 작동하고 다른 페이지에 대한 잘 작동하지만 그 기사 일단 특정 길이를 통과, 휙 됐어요. 더 긴 텍스트 블록에서 사용할 수있는 또 다른 솔루션이 있습니까? 처리중인 기사의 길이는 약 33,000 자 (공백 포함)입니다.

나는 이와 같은 질문을하기 전에 내가 실제로 테스트 한 적이없는 단 하나의 대답만을 얻었다. 이전에는 특정 시나리오에 대해 다른 방법으로 주위를 둘러 보았지만 이번에는 한 번에 하나의 기사이기 때문에이 방법을 사용할 수 없습니다. pcre.backtrack_limitpcre.recursion_limit을 최대 500,000까지 변경해 보았습니다. 아무런 효과가 없었습니다. 왜 이런 일이 벌어지고 있으며,이 거대한 텍스트 블록에서도 작업을 계속하기 위해 내가 할 수있는 일이 무엇인지에 대한 다른 아이디어가 있습니까? 30,000 자 제한은 약간 낮은 것으로 보이는데, 이는 5,000-6,000 자 (약 5,700 자)입니다. 두 개의 분리 된 텍스트 블록에있는 경우 시작 및 중지를 찾을 수 없으므로 별개로 분리 할 수 ​​있습니다.

+0

"작동이 중지되면"정확히 무엇이 발생합니까? 오류가 반환됩니까? 조용한 실패와 일치 하는가? 100 % CPU를 씹으십시오. (나는 PCRE의 매칭 알고리즘의 기하 급수적 인 최악의 경우 동작을 유발하는 정규 표현식을 작성했을지 모르지만 자세한 내용은 알 수 없다.) – zwol

+0

아무 것도하지 않고 단지 0, 오류 또는 아무것도 반환하지 않는다. . – animuson

+0

'preg_last_error()'를 확인 했습니까? 내가 그랬다는 것을 기억하지 못한다. – mvds

답변

0

HTML을 사용하는 것처럼 보입니다. 다양한 파서 중 하나를 사용하는 것이 좋습니다. 예를 들어, DOM에는 a specific class for comments이 있습니다. 따라서 DOM과 함께 작동 할 수 있습니다. 안타깝게도 DOM은 사용하기에 다소 어색합니다.

또 다른 옵션으로는 XMLReader을 사용할 수 있습니다.이 옵션은 XML을 스트림으로 읽은 다음 그 스트림을 토큰으로 처리합니다. 어떤 의견인지 이해하는 것 같습니다. 나는 그것을 사용한 적이 한번도 없기 때문에 그것이 얼마나 효과가 있는지 말할 수는 없다. (DOM의 loadHTMLsaveXML 메서드를 사용하여 HTML을 XML로 변환 할 수 있습니다. 너무 끔찍한 형태는 아닙니다.)

마지막으로 사용자 정의 주석에 대한 토크 나이저 또는 파서를 작성하는 것이 좋습니다. 너무 어려워서는 안되며 내가 지적한 XML 솔루션을 배우는 것보다 함께 해킹하는 것이 더 빠를 수도 있습니다.

1

나는이 문제에 한 번 부딪 혔고 그 당시에 내가 풀 수있는 유일한 방법은 문자열을 분할하는 것이었다. explode() 또는 preg_split() 수 있습니다.

// regexps have failed miserably on very large tables... 
    $parts = explode("<table",$html); 

을하지만 2 년 전 :

내 소스 코드에서 그대로 인용.

+0

꽤 좋은 생각입니다. – Stephen

관련 문제