2010-05-27 4 views
0

긴 위키 페이지에서 자주 검토하고 변경해야하는 html, 사용자 정의 코드 및 일반 텍스트가 혼합되어 있습니다. 저는 독점적 인 위키와 같은 응용 프로그램을 사용하고 있으며 응용 프로그램의 기능 또는 사용자 입력의 유효성 검사 방법을 제어 할 수 없습니다. 사용자가 추가하는 페이지의 레이아웃은 매우 특정한 표준 레이아웃을 따라야하며 항상 자주 변경되는 표준 인 특정 장소에만 매우 특정한 텍스트를 포함해야합니다. 사용자가 표준을 벗어난 페이지를 추가하면 해당 페이지가 삭제됩니다.Preg_replace regex, newlines, connection resets

저는 이러한 페이지를 모두 수동으로 교정하고 교정 할 수있는 자원이 없기 때문에 자동화가 유일한 해결책입니다. 사실이 모든 것이 분명히 여기에 필요한 것을 수행 할 대체 플랫폼이 이미 이해되어있는 시간 낭비입니다.

필자는이 post-validation과 자주 restandardization 과정을 자동화하기 위해 PHP 기반 API를 구축했습니다. 나는이 모든 혼합 된 텍스트를 처리 할 수있는 정규식 패턴을 설정할 수 있었으며 모든 단일 행을 처리 할 때 잘 작동합니다. 내가 가진 문제는 이것이다 : 줄 바꿈으로 긴 텍스트에 대한 정규 표현식이 형성되지 않으면 연결 재설정과 같은 예기치 않은 결과가 발생할 수있다. 문제 해결을 위해 서버 측 로그에 대한 액세스 권한이 없습니다. 어떻게 이것을 극복 할 수 있습니까?

이것은 내가 현재 가지고있는 것의 한 예일뿐입니다. 아래에서 찾고있는 {column} 및 {section} 태그는 원하는 수의 속성을 가질 수 있으며 텍스트를 포함 할 수 있습니다. {section}은 존재할 수도 있고 존재하지 않을 수도 있고 {column} 아래에 하나 이상의 행이 될 수도 있고 그렇지 않을 수도 있지만 {column} 안에 싸여 있어야합니다. {column} 자체가 존재할 수도 있고 존재하지 않을 수도 있으며, 그렇지 않은 경우 나중에 스크립트 아래에 기본 텍스트가 삽입되어 있으므로 걱정하지 않아도됩니다. 내부 섹션 내용을 잡고 대신 HTML div 태그로 묶고 싶습니다.

 
$pattern = "/\{column:id=summary([|]?([a-zA-Z0-9-_ ]+[:][a-zA-Z0-9-_ ]+[ ]?))\}(.*)({section([|]([a-zA-Z0-9-_ ]+[:][a-zA-Z0-9-_ ]+[ ]?))\}(.*)\{section\}(.*))?{column\}/s"; 
$replacement = "{html}<div id='summary'>$7</div>{html}"; 
$text = preg_replace($pattern, $replacement, $subject); 

는 {열} 처리하고 {절} 속성과 새로운에만 유효한 HTML 매개 변수를 전달 ... 나는 순간에 즉석를 사용하고 정확한 패턴을 기억하지 수 있지만, 그것은 충분히 가까이 html div 또는 그 하위 텍스트 자체는 문제이지만 현재 당장의 주요 관심사는 연결 재설정을하지 않고 위 {section} 내에서 (. *) 값을 얻는 것입니다. 어떤 포인터?

답변

1

아마도 이것은 당신이 찾고있는 것이 아니지만 정규 표현식을 사용하지 마십시오! 매우 구조화되고 복잡한 텍스트를 파싱하려고 시도하고 있습니다. 이렇게하려면 파서를 사용해야합니다. 나는 PHP에 대해 무엇이 가능한지 모르겠다. (할 수있는 한 구글도 할 수있다. 나는 특별한 추천을 할 입장이 아니다.)하지만 나는 무엇인가 존재한다고 확신한다.

연결 재설정의 원인은 내 생각에 "긴 텍스트"문제를 언급하기 때문에 메모리 할당 문제가 발생했습니다. do not do 당신의 정규식이 예상치 못하게 거대한 성능을 가질 것이라고 생각합니다. 하지만 최선의 방법은 가능한 경우 정규식 기술을 폐기하고 실제 파서로 전환하는 것입니다.

1

충돌 문제의 근본적인 원인을 발견했습니다. 치명적인 역 추적 (http://www.regular-expressions.info/catastrophic.html)입니다. 따라서이를 처리 할 정제 패턴이 작동하지 않는다면 (그리고 누군가 제안 할 패턴이 있다면 공유하십시오) 다른 텍스트 파서 솔루션으로 전환하는 것이 가장 좋을 것입니다.

1

내가 볼 수있는 유일한 실제 문제는 모두 (.*)입니다. /s 모드에서는 각 (.*)이 처음에는 전체 페이지를 튕겨 내며 대부분의 길을 되돌려 야합니다. 모두를 (.*?) (으)로 변경하십시오 (예 : 꺼리는 수량 기호로 전환). 그러면 더 빨리 작동합니다.