簡體   English   中英

PHP中preg_match_all上的Fastcgi 500錯誤

[英]Fastcgi 500 error on preg_match_all in PHP

我正在嘗試設置一些奇異的PHP代碼(我不是專家),並且在包含“ preg_match_all”的PHP行上出現FastCGI錯誤500。

當我注釋掉該行時,頁面返回200(但不是它的原意)。

該代碼將解析從數據庫加載的PHP,HTML和JavaScript內容,並將它們組成以返回完成的頁面。

現在,通過放置一些error_log條目,我可以確定帶有preg_match_all的行是500的原因。但是,在頁面加載過程中該行多次被擊中,在其他情況下,該行不會導致錯誤。

看起來是這樣的:

preg_match_all ("/(<([\w]+)[^>]*>)((?:.|\n)*)(<\/\\2>)/",
                $part['data'], $tags, PREG_PATTERN_ORDER|PREG_OFFSET_CAPTURE);

主題字符串是一段類似於以下內容的文本:

<script> ... some javascript functions ... </script>

編輯:這是在其他地方正常運行的代碼,因此這很可能是PHP設置或環境差異。 我在帶有FastCGI的IIS6上使用PHP 5.2.13。

編輯:日志文件中未提及任何內容。 至少我沒有檢查過:

  • IIS日志
  • 事件記錄
  • PHP日志

編輯: jab11 指出了問題 ,但還沒有解決方案:

任何想法或方向都將受到歡迎。

$part['data']可能會非常大嗎? 當我在大於100 KB的字符串上使用preg_match_all時,會出現500錯誤。

這是一個很好的例子,為什么用正則表達式處理HTML是個壞主意。 我敢打賭,由於HTML源字符串包含一些未關閉的標簽,因此您正陷入堆棧溢出的局面,這使得regex嘗試了各種各樣的排列,以徒勞無益地嘗試找到關閉標簽( </\\2> )。 在32 KB的HTML文件中,可以很容易地將正則表達式從手推車上扔下來。 也許堆棧在另一台服務器上的大小是不同的,所以它可以在一個服務器上工作,而在另一個服務器上不能工作。

快速測試:

我將正則表達式應用於了此頁面的源代碼(在刪除了</html>標記后)。 RegexBuddy立即進行了約一分鍾的消聲處理,然后與<head><body>標記匹配(成功)。 <html>調試正則表達式表明,它花了正則表達式引擎970257步驟來發現它不匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM