2014-02-05 83 views
0

我有以下問題:我嘗試使用的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例如(我從來不知道^^ )

謝謝

回答

0

您需要s修改,以匹配多行,看到manual

... 
|s",$website,$matches); 

然而,正則表達式是不是在b est方法來解析html,你最好使用PHP Simple HTML DOM解析器。

+1

謝謝你,它工作得很好! :)我會看看簡單的HTML DOM解析器! –

1

對於跟蹤html源文件,HTMLDOM類比preg_match更好,它很乾淨。

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); 
^ 

您還應該使用.*?進行匹配非貪婪。否則,如果網站包含多個格式如此的表格,則可能會匹配從一個表格的開頭到另一個表格的結尾。

+0

也很好推薦使用'(\ s *?)',而不是在搜索主題中放置新行,這樣它會忽略可以格式化html顯示的空格/製表符。 –

+0

此代碼似乎適用於特定的HTML佈局。如果你想變得更加靈活,你應該使用HTML DOM解析器而不是正則表達式。 – Barmar

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 
)