2014-01-07 22 views
1

我有一個腳本,通過cURL提交一個POST請求到外部網站,並期望收到一個文件作爲迴應。但是,如果出現錯誤,該網站將返回一個HTML錯誤頁面,而不是預期的文件。如何使用正則表達式測試,如果一個字符串包含一個HTML頁

我有響應存儲在一個字符串,我想檢查如果字符串包含HTML頁面,如果沒有,我們可以假設字符串包含請求的文件數據。

我無法創建正則表達式來測試字符串是否爲HTML頁面。我想測試下:

  • 數據具有先導開口HTML標籤:<\s*html.*>

  • 數據具有後續打開身體標記:<\s*body.*>

  • 的數據有後續關閉機構標記:<\/\s*body.*>

  • 該數據有一個隨後的結束HTML標記:<\/\s*html.*>

我試過如下:

function isHTMLPage($data) { 
    $html_file_regex = '/<\s*html.*>.*<\s*body.*>.*<\/\s*body.*>.*.<\/\s*html.*>/'; 
    return preg_match($html_file_regex, strtolower($data)) === 1; 
} 

函數返回false(不匹配)在下面的測試數據:

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>Test Page</title> 
</head> 
<body> 
<div>test Content</div> 
</body> 
</html> 

什麼是錯的我正則表達式?

/<\s*html.*>.*<\s*body.*>.*<\/\s*body.*>.*.<\/\s*html.*>/

+1

這可能比您想象的要簡單; Content-Type標題返回什麼(在不同的結果之間)?例如如果服務通常返回json,你應該看到'application/json',但錯誤頁面會切換到'text/html'。 –

+0

我不確定你的目的,但不解析HTML使用HTML DOM解析器 –

+1

它是標準的HTML取回失敗的HTML頁面,例如,一個404頁面。這仍然是一個有效的HTML頁面,但它只會說一些版本的「文件未找到」。您應該檢查http狀態代碼。 –

回答

2

.不匹配換行符,除非你使用‘DOTALL’修改器:s

這就是說,你不應該這樣做。 應該代替的是檢查狀態代碼,例如404以指示找不到文件。畢竟,如果您期望獲得的文件本身就是一個HTML文件呢?

+3

雖然狀態碼不是可靠的。儘管服務內容的人員應該遵循標準,但他們中的很多人將錯誤響應歸類爲「200 OK」,並且只是服務器故障頁面。 –

+0

@BradChristie:我從來沒有見過錯誤頁面,錯誤代碼爲200。這讓我很難過,人們會這樣做:/ –

+1

@RocketHazmat:永遠不會說我贊同它,只是我見過它發生。我同意,這很傷心。我目睹了'/ contact/1 /' - >'200 OK' - >'{id:1,name:'foo'}',然後跟着'/ contact/-1' - >'200 OK' - >'{error:'not found'}'。 –

0

使用s(PCRE_DOTALL)修改器:

$html_file_regex = '/<\s*html.*>.*<\s*body.*>.*<\/\s*body.*>.*.<\/\s*html.*>/s'; 

根據PHP手冊,「如果設定了此修正,在模式中的圓點元字符的所有字符,包括換行符相匹配。沒有它,新行被排除在外「

相關問題