如果字符串包含HTML页面,如何使用正则表达式测试

时间:2014-01-07 16:01:44

标签: php regex pcre

我有一个脚本,它通过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.*>/

2 个答案:

答案 0 :(得分:2)

.与换行符不匹配,除非您使用“dotall”修饰符:s

那就是说,你不应该这样做。您应该做的是检查状态代码,例如404以指示找不到该文件。毕竟,如果您希望获得的文件本身就是HTML文件,该怎么办?

答案 1 :(得分:0)

使用s(PCRE_DOTALL)修饰符:

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

根据PHP手册,“如果设置了此修饰符,则模式中的点元字符匹配所有字符,包括换行符。没有它,排除了换行符。“