我正在尝试使用正则表达式,如下所示:
preg_match_all('|<table.*</table>|',$html,$matches, PREG_SET_ORDER);
但这不起作用,我认为问题是字符串$html
内的新行
有人可以告诉我一个解决方法吗?
答案 0 :(得分:4)
除非使用s pattern modifier,否则该点与换行符不匹配。
preg_match_all('|<table.*?</table>|s',$html,$matches, PREG_SET_ORDER);
(请注意,使用正则表达式来解析HTML中排名最差的资本罪行)。
答案 1 :(得分:3)
在决定下一步该做什么之前,我先读一读:http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html
通常,使用RegEx解析HTMl不是一个好主意。
我建议使用DOM
您可以查看PHP Simple HTML DOM Parser作为替代方案。
主要特点:
- 用PHP5 +编写的HTML DOM解析器让您以非常简单的方式操作HTML!
- 需要PHP 5 +。
- 支持无效的HTML。
- 使用选择器在HTML页面上查找标签,就像jQuery一样。
- 从一行中提取HTML内容。
答案 2 :(得分:1)
preg_match_all('|<table.*?</table>|ms',$html,$matches, PREG_SET_ORDER);
答案 3 :(得分:1)
您是否尝试过多线修改器m
?
preg_match_all('|<table.*</table>|m',$html,$matches, PREG_SET_ORDER);
答案 4 :(得分:0)
使用/ s标志来获取'。'也适用于新行字符,或只是明确检查新行字符 - 通常是'[\ n \ r]'。我自己还没看过,但请查看http://www.pcre.org/pcre.txt
上PCRE库的更多信息小心你如何形成你的模式 - 长输入字符串与新线混合被误解的模式可能导致无法解释的脚本失败和连接重置。
在您的情况下,此处似乎不需要PCRE功能,无论如何都可能导致意外结果。如果您只是想在页面上提取单个表的内容,为什么不做最基本的...
$start = stripos($input, "<table>"); $end = stripos($input, "</table>", $start); $my_table = substr($input, $start, $end);
答案 5 :(得分:0)
编辑:我意识到使用正则表达式解析HTML是不对的。
更好:您可以将$html
读入SimpleXML对象并使用SimpleXML的Xpath进行解析。 (功能强大且比DOM扩展恕我直言更容易使用。)
像这样:
$html = "<html><body><table id=\"mytbl\"><tr><td>ABC</td></tr><tr><td>DEF</td></tr></table></body></html>";
$xml = simplexml_load_string($html);
if($xml)
foreach($xml->xpath("/html/body/*") as $item) {
echo $item["id"] . "<br>"; // mytbl
foreach($item->tr as $tr) {
echo $tr->td . "<br>"; // 1:ABC, 2:DEF
}
}