我有以下问题:我尝试使用preg_match找到网站的一部分:
preg_match("|<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=5 WIDTH=1280 HEIGHT=50>
<TR VALIGN=TOP>
<TD WIDTH=1280 BGCOLOR=WHITE>
<FONT COLOR=BLACK SIZE=2>
This
is
a
test
</FONT>
</TR>
</TABLE>
|",$website,$matches);
它工作得很好......但是表格的价值(在这种情况下“这是一个测试”)每天都在变化,所以我试着这样做:
preg_match("|<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=5 WIDTH=1280 HEIGHT=50>
<TR VALIGN=TOP>
<TD WIDTH=1280 BGCOLOR=WHITE>
<FONT COLOR=BLACK SIZE=2>
(.*)
</FONT>
</TR>
</TABLE>
|",$website,$matches);
但是现在函数的返回值是0,所以没有找到任何匹配项。只有当我尝试这个时它再次起作用:
preg_match("|<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=5 WIDTH=1280 HEIGHT=50>
<TR VALIGN=TOP>
<TD WIDTH=1280 BGCOLOR=WHITE>
<FONT COLOR=BLACK SIZE=2>
(.*)
(.*)
(.*)
(.*)
</FONT>
</TR>
</TABLE>
|",$website,$matches);
所以现在我的问题是:即使表格的值今天有4行,明天有6行,我怎么才能找到该部分(我从来不知道^^)
谢谢
答案 0 :(得分:1)
对于跟踪html来源,HTMLDOM类优于preg_match
,并且它是干净的。
答案 1 :(得分:0)
您需要s
修饰符匹配多行,请参阅manual:
...
|s",$website,$matches);
但是,正则表达式不是解析html的最佳方法,你最好使用像PHP Simple HTML DOM解析器这样的东西。
答案 2 :(得分:0)
您需要使用s
(又名dotall)修饰符来允许.
匹配换行符:
preg_match("|<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=5 WIDTH=1280 HEIGHT=50>
<TR VALIGN=TOP>
<TD WIDTH=1280 BGCOLOR=WHITE>
<FONT COLOR=BLACK SIZE=2>
(.*?)
</FONT>
</TR>
</TABLE>
|s",$website,$matches);
^
您还应该使用.*?
来使比赛变得非贪婪。否则,如果网站包含多个这样格式化的表格,您可能会从一个表格的开头到另一个表格的结尾匹配。
答案 3 :(得分:0)
这样做 - (只是添加了一个包含\ n的条件。)
preg_match("/<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=5 WIDTH=1280 HEIGHT=50>
<TR VALIGN=TOP>
<TD WIDTH=1280 BGCOLOR=WHITE>
<FONT COLOR=BLACK SIZE=2>
((?:.|\n)*?)
<\/FONT>
<\/TR>
<\/TABLE>
/",$website,$matches);
print_r($matches);
//OUTPUT:
Array
(
[0] => <TABLE BORDER=1 CELLSPACING=0 CELLPADDING=5 WIDTH=1280 HEIGHT=50>
<TR VALIGN=TOP>
<TD WIDTH=1280 BGCOLOR=WHITE>
<FONT COLOR=BLACK SIZE=2>
This
is
a
test
</FONT>
</TR>
</TABLE>
[1] => This
is
a
test
)