2015-11-06 71 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。 –