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

Php 如果字符串包含HTML页面,如何使用正则表达式测试,php,regex,pcre,Php,Regex,Pcre,我有一个脚本,它通过cURL向外部站点提交POST请求,并期望收到一个响应文件。但是,如果出现错误,站点将返回一个HTML错误页面,而不是预期的文件 我将响应存储在一个字符串中,我想检查该字符串是否包含HTML页面,如果不包含,我们可以假设该字符串包含请求的文件数据 我在创建正则表达式以测试字符串是否是HTML页面时遇到问题。我想测试以下内容: function isHTMLPage($data) { $html_file_regex = '/<\s*html.*>.*<\

我有一个脚本,它通过cURL向外部站点提交POST请求,并期望收到一个响应文件。但是,如果出现错误,站点将返回一个HTML错误页面,而不是预期的文件

我将响应存储在一个字符串中,我想检查该字符串是否包含HTML页面,如果不包含,我们可以假设该字符串包含请求的文件数据

我在创建正则表达式以测试字符串是否是HTML页面时遇到问题。我想测试以下内容:

function isHTMLPage($data) {
  $html_file_regex = '/<\s*html.*>.*<\s*body.*>.*<\/\s*body.*>.*.<\/\s*html.*>/';
  return preg_match($html_file_regex, strtolower($data)) === 1;
}
  • 数据有一个开头的HTML标记:

  • 数据有一个后续的开始正文标记:

  • 该数据具有后续的结束正文标记:

  • 数据有一个后续的结束HTML标记:

我尝试了以下方法:

function isHTMLPage($data) {
  $html_file_regex = '/<\s*html.*>.*<\s*body.*>.*<\/\s*body.*>.*.<\/\s*html.*>/';
  return preg_match($html_file_regex, strtolower($data)) === 1;
}
函数isHTMLPage($data){
$html_file_regex='/.*.*./';
返回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
(PCRE\u DOTALL)修饰符:

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

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

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


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

这可能比您想象的要简单;
内容类型
标题返回什么(在不同结果之间)?e、 g.如果服务正常返回json,您应该看到
application/json
,但错误页面将切换到
text/html
。我不确定您的目的,但不要解析html使用html DOM ParserIt的标准在html失败时返回html页面,例如404页面。这仍然是一个有效的html页面,但它只会说“找不到文件”的某个版本。你应该检查http状态码。你们是对的,我应该查看返回头中的错误,而不是返回的数据。另外注意:上面的表达式:
/.*.*.*./
是一个经典的例子,即如何不编写正则表达式;它可能会很快匹配HTML文件,但在非HTML文件上声明不匹配几乎要花费很长时间。虽然提供内容的人应该遵循标准,但他们中的许多人将错误响应归类为
200 OK
,只提供一个失败页面。@BradChristie:我从未见过错误代码为200的错误页面。人们会这么做让我很难过:/@RocketHazmat:我从来没有说过我支持它,只是我亲眼目睹了它的发生。我同意,这是令人悲伤的。我见证了
/contact/1/
->
200ok
->
{id:1,name:'foo'}
,然后跟进
/contact/-1
->
200ok
{error:'notfound'}
。这实际上取决于API。我的AJAX系统总是返回
200ok
来说明请求本身是成功的,然后根据请求的实际结果返回
{“OK”:true[此处有更多数据]}
{“OK”:false,“error”:“出了问题”}
。@NiettheDarkAbsol:yup;我看到一些“代理”代码使用
{status:200,response:{…}}
{status:404,response:{msg:“notfound”}
(但两者都产生
200ok
)。