2015-11-06 67 views
0

我只需要匹配第一次出現的html鏈接與'data- {someData}'屬性。我寫的正則表達式如下圖所示:正則表達式首次出現html鏈接

\<a\s+(.+)\s+data-\s*(.+)\s*>(.+)<\/a>

和它的作品對HTML的PICE與像只有一個HTML鏈接:

SOME TEXT/HTML 
<a href="~/link.aspx?_id=B0B5056BD5984878BEB5C92AF6B74DB3&amp;_z=z" 
    data-dms="{6782B150-F6FA-49E6-A2FF-6D6014470373}" 
    data-targetid="{B0B5056B-D598-4878-BEB5-C92AF6B74DB3}" 
    data-dms-event="Content button">Link1 
</a> 
SOME TEXT/HTML 

,但問題是當HTML中包含更多的聯繫。然後正則表達式匹配,直到最後一次出現</a>。所以,從下面的HTML:

SOME TEXT/HTML 
<a href="~/link.aspx?_id=B0B5056BD5984878BEB5C92AF6B74DB3&amp;_z=z" 
    data-dms="{6782B150-F6FA-49E6-A2FF-6D6014470373}" 
    data-targetid="{B0B5056B-D598-4878-BEB5-C92AF6B74DB3}" 
    data-dms-event="Content button">Link1 
</a> 
SOME TEXT/HTML 
<a href="~/link.aspx?_id=1256272320C4429DAB8A1F40D429C841&amp;_z=z" 
    data-dms="{6782B150-F6FA-49E6-A2FF-6D6014470373}" 
    data-targetid="{12562723-20C4-429D-AB8A-1F40D429C841}" 
    data-dms-event="Content button">Link2 
</a> 
SOME TEXT/HTML 

我需要修復我的正則表達式來只匹配:

<a href="~/link.aspx?_id=B0B5056BD5984878BEB5C92AF6B74DB3&amp;_z=z" 
    data-dms="{6782B150-F6FA-49E6-A2FF-6D6014470373}" 
    data-targetid="{B0B5056B-D598-4878-BEB5-C92AF6B74DB3}" 
    data-dms-event="Content button">Link1 
</a> 
+1

爲什麼你不使用DOM解析器來解析HTML? –

回答

2

首先你,你看起來比正則表達式別的選擇嗎? Regexp不是解析html的理想工具。如果你的語言有一個DOM,你應該能夠從中提取所需的標籤。

這就是說,如果你需要使用正則表達式,有兩種方法可以解決你面臨的問題。

首先,一般而言,更好的解決方案是在您的匹配方面更具限制性。而不是匹配任何字符與.匹配任何合法字符與字符類如[^>]

第二種是使用熱切匹配而不是貪婪匹配。這是通過在你的量詞後加?來完成的。即替換++?**?。通過使用熱切匹配,正則表達式將返回找到的第一個匹配,而不是最後一個匹配。

+0

感謝您的建議。添加'?'解決了我的問題。我選擇了正則表達式,因爲我只需要運行這段代碼一次,我更願意避免添加外部庫來處理DOM。 –