[英]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。
編輯:日志文件中未提及任何內容。 至少我沒有檢查過:
任何想法或方向都將受到歡迎。
$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.