어제 웹 사이트에 흰색 페이지 만 표시되는 이상한 버그를 추적했습니다. 내용이 표시되지 않고 오류 메시지가 표시되지 않습니다.php - 왜이 정규식 내 문자열을 제로 길이를 자릅니다?
나는 preg_replace에서 사용 된 정규 표현식이 문제라는 것을 알게되었습니다.
나는 HTML을 에코하기 직전에 누적 된 컨텐츠의 제목 html 태그를 바꾸기 위해 정규 표현식을 사용했습니다. html은 버그가 발생한 페이지 (60KB - 너무 크지 않음)에서 다소 커졌으며 preg_replace/정규식은 특정 길이의 문자열 만 처리 할 수 있습니다. 또는 정규식이 너무 엉망입니다.
문제가 재생이 샘플 프로그램의 룩이 (PHP 5.2.9 테스트)
function replaceTitleTagInHtmlSource($content, $replaceWith) {
return preg_replace('#(<title>)([\s\S]+)(<\/title>)#i', '$1'.$replaceWith.'$3', $content);
}
$dummyStr = str_repeat('A', 6000);
$totalStr = '<title>foo</title>';
for($i = 0; $i < 10; $i++) {
$totalStr .= $dummyStr;
}
print 'orignal: ' . strlen($totalStr);
print '<hr />';
$replaced = replaceTitleTagInHtmlSource($totalStr, 'bar');
print 'replaced: ' . strlen($replaced);
print '<hr />';
출력 :
는 오리지널 : 60,018
교체 0
따라서 함수는 길이가 60000 인 문자열을 가져오고 길이가 0 인 문자열을 반환합니다. 내가 정규식으로하고 싶지 않은 것.
변경
for($i = 0; $i < 10; $i++) {
총 문자열 길이를 감소시키기 위해
for($i = 0; $i < 1; $i++) {
로 출력은 :
는 오리지널 : 6018
교체 : 6018
교체를 제거하면 페이지 내용이 문제없이 표시됩니다.
'([\ s \ S] +?)'도 욕심이 없지만'([^ <] +)'는 처음에는'<'에서 더 잘 멈추고 더 이상 갈 수 없습니다. '