2014-01-07 24 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手册,“如果设定了此修正,在模式中的圆点元字符的所有字符,包括换行符相匹配。没有它,新行被排除在外“

相关问题