2011-01-26 130 views
1

我有HTML源代碼,我必須在HTML中獲取一些信息文本。我無法使用DOM,因爲文檔格式不正確。如何使用PHP和RegEx從HTML源代碼獲取數據?

也許,來源可能會改變,我不知道這種情況。所以,對於大多數情況來說,解決這個問題必須是明智的。

我正在使用curl獲取源代碼,我將使用preg_match_all函數和正則表達式編輯它。

來源:
...
<TR Class="Head1">
<TD width="15%"><font size="12">Name</font></TD>
<TD>:&nbsp;</TD>
<TD align="center"><font color="red">Alex</font></TD>
<TD width="25%"><b>Job</b></TD>
<TD>:&nbsp;</B></TD>
<TD align="center" width="25%"><font color="red">Doctor</font></TD>
</TR>
...
...
<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>
...

正如我們所看到的,是沒有很好地形成的來源。其實很可怕!但我無能爲力。 來源比這長。

我怎樣才能從源頭獲取數據?我可以刪除所有的HTML代碼,但我怎麼知道數據的順序?我可以用preg_match_all和regex做些什麼?我還可以做些什麼?

我在等你的幫助。

+2

您是否嘗試過使用`DOM`?你可以使用`@`來抑制錯誤,即使它沒有正常形成它仍然可以工作 – 2011-01-26 23:39:37

回答

2

如果你可以使用DOM,這比正則表達式好得多。看一看PHP Tidy - 它旨在管理格式不正確的HTML。

0

Don't use RegEx.該鏈接很有趣,但沒有提供信息,因此,HTML標記不是常規語言,因此不能簡單地使用正則表達式進行分析。

作爲遞歸解析算法的一部分,您可以使用RegEx解析各個「令牌」(單個開放標記;單個屬性名稱或值...),但不能使用神奇RegEx來解析所有HTML它自己的。

或者你可以使用解析器。

由於標記無效,因此您可以使用TagSoupPHP:Tidy

+0

好的,TagSoup和Tidy默認安裝在服務器上嗎? – Maozturk 2011-01-27 00:06:59

+0

我沒有這樣的印象;事實上,TagSoup是一個Java工具(我的糟糕!),雖然整潔顯然[與PHP捆綁在一起](http://www.php.net/manual/en/tidy.installation.php) – 2011-01-27 15:15:55

+0

非常好,形成的html文檔可以通過Tidy轉換爲格式良好的html,然後DOMDocument可以使用。 Thx所有。 – Maozturk 2011-02-09 13:20:25

0
$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) 
1

您可以使用DOM文檔加載格式錯誤的HTML:

$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"; 
} 

我抑制警告在上面的代碼爲簡潔。

輸出:

Age 
: 
32 
data 
    <!-- space --> 
    <!-- space --> 

使用正則表達式解析HTML可以是徒勞的HTML是不是一個正規的語言。