我有一个脚本,它通过cURL向外部站点提交POST请求,并期望收到响应的文件。但是,如果出现错误,网站将返回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.*>/
答案 0 :(得分:2)
.
与换行符不匹配,除非您使用“dotall”修饰符:s
那就是说,你不应该这样做。您应该做的是检查状态代码,例如404
以指示找不到该文件。毕竟,如果您希望获得的文件本身就是HTML文件,该怎么办?
答案 1 :(得分:0)
使用s
(PCRE_DOTALL)修饰符:
$html_file_regex = '/<\s*html.*>.*<\s*body.*>.*<\/\s*body.*>.*.<\/\s*html.*>/s';
根据PHP手册,“如果设置了此修饰符,则模式中的点元字符匹配所有字符,包括换行符。没有它,排除了换行符。“