在preg_match中使用多行字符串

时间:2014-02-05 19:20:47

标签: php preg-match

我有以下问题:我尝试使用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行,我怎么才能找到该部分(我从来不知道^^)

谢谢

4 个答案:

答案 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
)