Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PHP和RegEx从HTML源代码中获取数据?_Php_Regex_Preg Match_Preg Match All - Fatal编程技术网

如何使用PHP和RegEx从HTML源代码中获取数据?

如何使用PHP和RegEx从HTML源代码中获取数据?,php,regex,preg-match,preg-match-all,Php,Regex,Preg Match,Preg Match All,我有HTML源代码,我必须在HTML中获得一些信息文本。我不能使用DOM,因为文档格式不正确 也许,来源可能会改变以后,我不能意识到这种情况。因此,在大多数情况下,解决这一问题必须是明智的 我用curl获取源代码,我将用preg_match_all函数和正则表达式编辑它 资料来源: … Name : Alex 作业 : 医生 ... ... 年龄 : 32 数据 ... 正如我们所看到的,来源不是很好。事实上,太可怕了!但我无能为力。 源比这个

我有HTML源代码,我必须在HTML中获得一些信息文本。我不能使用DOM,因为文档格式不正确

也许,来源可能会改变以后,我不能意识到这种情况。因此,在大多数情况下,解决这一问题必须是明智的

我用curl获取源代码,我将用preg_match_all函数和正则表达式编辑它

资料来源:


Name


Alex

作业


医生


...
...

年龄


32

数据




...

正如我们所看到的,来源不是很好。事实上,太可怕了!但我无能为力。 源比这个长

我如何从源代码中获取数据?我可以删除所有HTML代码,但如何知道数据的顺序?我可以用preg_match_all和regex做什么?我还能做什么

我在等你的帮助。

这个链接很有趣,但没有提供信息,所以它的长短不一之处在于HTML标记不是一种常规语言,因此不能简单地使用正则表达式进行解析

作为递归解析算法的一部分,可以使用正则表达式解析单个“标记”(单个打开的标记;单个属性名称或值…),但不能使用神奇的正则表达式独自解析HTML

或者您可以使用解析器


由于标记无效,可能您可以使用或。

如果您可以使用DOM,那么这比正则表达式要好得多。看一看a-它设计用于管理格式错误的HTML。

$regex=您可以使用DOMDocument加载格式错误的HTML:

$regex = <<<EOF
<TR Class="Head2">\s+<TD width="15%" align="left">Age</B></TD>\s+<TD>:&nbsp;</TD>\s+<TD align="center"><font color="red">(\d+)</font></TD>\s+<TD width="15%"><font size="10">(\w+)</TD></font>\s+<TD>&nbsp;</B></TD>\s+<TD width="40%">&nbsp;</TD>\s+</TR>
EOF;

preg_match_all($regex, $text, $result);

var_dump($result)
$doc = new DOMDocument();
@$doc->loadHTML('<TR Class="Head2">
<TD width="15%" align="left">Age</B></TD>
<TD>:&nbsp;</TD>
<TD align="center"><font color="red">32</font></TD>
<TD width="15%"><font size="10">data</TD></font>
<TD>&nbsp;</B></TD>
<TD width="40%">&nbsp;</TD>
</TR>');


$tds = @$doc->getElementsByTagName('td');
foreach ($tds as $td) {
 echo $td->textContent, "\n";
}
$doc=newDOMDocument();
@$doc->loadHTML($doc)
年龄
: 
32
数据
');
$tds=@$doc->getElementsByTagName('td');
foreach($tds作为$td){
echo$td->textContent,“\n”;
}
为了简洁起见,我在上面的代码中隐藏了警告

输出:

Age
: 
32
data
  <!-- space -->
  <!-- space -->
年龄
: 
32
数据

使用正则表达式解析HTML可能是徒劳的,因为HTML不是一种常规语言。

您是否尝试过使用
DOM
?您可以使用
@
来抑制错误,即使格式不好,它仍然可以+1-当我记得TagSoup是用Java编写的(这个问题是用PHP编写的)时,我在我的答案中添加了PHP Tidy,但您的答案中首先包含了它。好吧,TagSoup和Tidy是默认安装在服务器上的吗?我没有这样的印象;事实上,TagSoup是一个Java工具(我的错!),虽然tidy显然是非格式良好的html文档,但tidy可以将其转换为格式良好的html,然后DOMDocument可以使用。正如你所说,我认为正则表达式在这方面没有用处。格式不好的html文档可以由Tidy和DOM处理,也可以仅由SimpleHTMLDom处理。