2011-09-02 154 views
1

可能重複:
Best methods to parse HTML with PHP正則表達式匹配的錶行

我有一點匹配表中的行與預浸麻煩。這裏是我的表達:(包括所有的符號)

<TR[a-z\=\"a-z0-9 ]*>([\{\}\(\)\^\=\$\&\.\_\%\#\!\@\=\<\>\:\;\,\~\`\'\*\?\/\+\|\[\]\|\-a-zA-Z0-9À-ÿ\n\r ]*)<\/TR> 

正如你所看到的,它試圖馬赫一切都在兩者之間TR標記,部分有多個表中的行打交道時的偉大工程,但是,往往需要多個錶行作爲一個匹配,而不是匹配每個錶行:

<TR> 
<TD>test</TD> 
</TR> 
<TR> 
<TD>test2</TD> 
</TR> 

產量:

Array 
    (
     [0] => <TD>test</TD> 
       <TD>test2</TD> 
    ) 

而不是我希望它:

Array 
    (
     [0] => <TD>test</TD> 
     [1] => <TD>test2</TD> 
    ) 

我意識到這樣做的原因是因爲它符合符號,並且搜索自然需要其餘的行,直到它碰到最後一個。

所以基本上,我想知道是否有人可以幫助我添加表達式,以便在TR標籤之間排除任何帶有「TR」的內容,以防止它匹配多行。

+1

*(相關)* [最佳解析方法](http://stackoverflow.com/questions/3577641/best-methods-to-parse-html/3577662#3577662) – Gordon

+1

您有選擇使用一個PHP的HTML解析器,而不是正則表達式? – Chandu

+1

而不是手動任何:有PHP的現成的HTML表提取庫。 – mario

回答

2

嘗試使用全局搜索:

preg_match_all("/<td>([^<]+)/", $html, $matches);

+0

這幾乎可以工作,但是我需要在標籤之間的所有內容,而不僅僅是來自td標籤的單個項目。從表達式中的「[^ <]」排除「<」,而不是排除字符串「TR」或者甚至「」? – user925996

+0

嘗試設置'sim'標誌並用'tr'替換正則表達式中的'td': '/ ([<] +)/ sim' – Kakashi

2

使用延遲匹配在您正則表達式:<tr.*?</tr>

但正如其他人所說的,這是更強大的,如果你能使用合適解析器。

+0

我嘗試過簡單的html解析器和ganon,但都失敗了,必須解析。 – ravisoni