2013-05-01 53 views
0

我解析一些事務,例如3周的交易是這樣的:乾淨的HTML代碼用正則表達式

<TR class=DefGVRow> 
<TD>29/04/2013</TD> 
<TD><A href="javascript:__doPostBack('ctl00$cp$GVMov','Deposito$29/04/2013|0140959158|+|0,00')">DEPOSITO 0140959158</A></TD> 
<TD>0140959158</TD> 
<TD align=right>336,00</TD> 
<TD align=center>+</TD> 
<TD align=right>16.210,60</TD></TR>H 
<TR class=DefGVAltRow> 
<TD>29/04/2013</TD> 
<TD>RETIRO ATM CTA/CTE</TD> 
<TD>1171029739</TD> 
<TD align=right>600,00</TD> 
<TD align=center>-</TD> 
<TD align=right>15.610,60</TD></TR> 
<TR class=DefGVRow> 
<TD>29/04/2013</TD> 
<TD>C.SERV.CAJERO AUT.</TD> 
<TD>1171029739</TD> 
<TD align=right>3,25</TD> 
<TD align=center>-</TD> 
<TD align=right>15.607,35</TD></TR> 

而且我現在的正則表達式是:

<TR class=\w+> 
<TD>(?<day>\d{1,2})/(?<month>\d{1,2})/(?<year>\d{4})</TD> 
<TD>(?<description>.+?)</TD> 
<TD>(?<id>\d{3,30})</TD> 
<TD.+?>(?<amount>[\d\.]{1,20},\d{1,10})</TD> 
<TD.+?>(?<info>.+?)</TD> 
<TD.+?>(?<balance>[\d\.]{1,20},\d{1,10})</TD></TR> 

我如何可以編輯

<TD>(?<description>.+?)</TD> 

要處理與同一提取的其他部分匹配的可選標記嗎? (基本上:捕獲組時如何忽略A標籤)

謝謝!

+2

對於你的理智的緣故,解析這個HTML。 – Blender 2013-05-01 01:42:59

+2

正則表達式不是解析html/xml的最佳方式。看看[XmlDocument](http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.aspx),你可以使用XPath來解析它的元素,並且更容易實現你的目標。 – 2013-05-01 01:42:59

+0

**不要使用正則表達式來解析HTML **。你不能用正則表達式可靠地解析HTML,你將面臨悲傷和挫折。只要HTML從你的期望改變,你的代碼就會被破壞。有關如何使用已經編寫,測試和調試的PHP模塊正確解析HTML的示例,請參閱http://htmlparsing.com/php。 – 2013-05-01 02:30:22

回答

2

這是一個非常普遍的問題。請檢查此epic answer並停止使用regexp來「解析」html,而是使用適當的解析器,並獲得您需要的XPath甚至CSS選擇器。

+1

我明白了。無論如何,我找到了一種方法來定義可選組,所以我會回答我自己的問題。順便說一句,我相信解析HTML正則表達式不是最好的,但在這種情況下,HTML是非常固定的 – eried 2013-05-01 02:13:18

+0

好吧,如果你有這種感覺沒問題。只是想警惕在本頁面中絆倒的其他人。 – fotanus 2013-05-01 02:17:04

2

刪除 '可選' 鏈接:

<TR class=\w+> 
<TD>(?<day>\d{1,2})/(?<month>\d{1,2})/(?<year>\d{4})</TD> 
<TD>(?:<A href=".*>)?(?<description>.+?)(?:</A>)?</TD> 
<TD>(?<id>\d{3,30})</TD> 
<TD.+?>(?<amount>[\d\.]{1,20},\d{1,10})</TD> 
<TD.+?>(?<info>.+?)</TD> 
<TD.+?>(?<balance>[\d\.]{1,20},\d{1,10})</TD></TR>