我需要一个正则表达式来获取img标签的src属性

时间:2009-05-04 16:31:45

标签: c# regex

我的字符串符合字面

"lt;img src=quot;http://www.news.gov.tt/thumbnail.php?file=Hon__Jerry_Narace_Minister__Of_Health_599152837.jpgamp;size=summary_mediumquot;gt;lt;pgt;Fifty-eight people have been tested for Influenza A/H1N1 virus, commonly called swine flu, in Trinidad and Tobago. \r\nThe tests have all come back negative, Health Minister Jerry Narace said yesterday. \r\n\r\n"

我想得到'';'之间的网址字符串,即

http://www.news.gov.tt/thumbnail.php?file=Hon__Jerry_Narace_Minister__Of_Health_599152837.jpgamp;size=summary_medium

在.NET中使用正则表达式。

有什么想法吗?

4 个答案:

答案 0 :(得分:2)

Regex r = new Regex("(?<=img src=&quot;).*?(?=&quot;)");

应该为你做的伎俩,假设某个地方没有任何&符号。

编辑:在发布这个答案后,我注意到我之前在你的字符串中看到的&符号已不复存在。

答案 1 :(得分:1)

这个正则表达式应该让你解决只是 IMG标签的src内容:

(?<=<img.*?src=\&quot;)[^\"]*(?=\&quot;.*?((&frasl;&gt;)|(&gt;.*&lt&frasl;img&gt;)))

它不依赖于标记中的定位或src,它确实要求您将区分大小写设置为不敏感以保持稳定。

Patjbs版本会抓住你所有标签的src,如果你正在解析包含外部内容链接的html,这会导致不稳定 - 例如javascript,外部div内容等。

string htmlString = @"<img id="tagId" src="myTagSource.gif" name="imageName" />";
string matchString = Regex.Match(htmlString, @"(?<=<img.*?src=\")[^\"]*(?=\".*?((/>)|(>.*</img)))").Value;

matchString现在等于“myTagSource.gif”

我注意到你的输入字符串遗漏了一些&amp; (&符号)表示逃避字符,如“没有办法(不强迫逻辑寻找“lt; gt;)以编程方式解释这些字符。您必须对初始字符串执行替换以将其转换为正则表达式可解释[是一个单词?]字符串。

因此,假设您从页面中获取所有这些字符串,您需要假设所有实例都是lt;成为&lt;和所有GT;成为&gt;,全部成为“。

您也不能假设所提供的数据始终以此形式返回,有时字符串可能包含其他标记信息(ID,名称,边框信息等)。所以我认为也许最具意识形态和最易维护的解决方案可能略有不同。最意识形态的方法是在一个解析中完成它,但最友好的维护可能是分两步完成,首先将输入字符串转换为标准的html字符串,第二步提取源数据。

或者,您可以在一个解析中执行此操作,将我的模式中的html构造替换为相应的字符替换(假设他们使用的是标准编码,但丢弃了&符号),但是,它不是非常可读,并且可能会对维护代码的任何人造成一些混淆:

(= \ QUOT; *((frasl; GT;(小于= LT; IMG SRC = \ QUOT??)。???)|(GT * LT; frasl; imggt;)))

编辑如果事实证明他们 使用标准编码而就没有提供&amp;在你的例子中,你可以在第一个模式中使用:

引用解码的URL
string MatchValue = Regex.Match(HttpUtility.UrlDecode(inputString), pattern).Value;

这会将您从它们返回的字符串解码为标准字符串,用正确的字符替换转义字符,然后运行相同的模式。

答案 2 :(得分:1)

^\"lt;img\s+src\=quot;(.+)quot;

给出以下输入:

"lt;img src=quot;http://www.news.gov.tt/thumbnail.php?file=Hon__Jerry_Narace_Minister__Of_Health_599152837.jpgamp;size=summary_mediumquot;gt;lt;pgt;Fifty-eight people have been tested for Influenza A/H1N1 virus, commonly called swine flu, in Trinidad and Tobago. \r\nThe tests have all come back negative, Health Minister Jerry Narace said yesterday. \r\n\r\n"

此正则表达式返回以下内容:

http://www.news.gov.tt/thumbnail.php?file=Hon__Jerry_Narace_Minister__Of_Health_599152837.jpgamp;size=summary_medium

我认为这正是你所需要的。

希望这有帮助, 莱恩

答案 3 :(得分:0)

正则表达式在解析HTML方面根本不好(请参阅Can you provide some examples of why it is hard to parse XML and HTML with a regex?了解原因)。你需要的是一个HTML解析器。有关使用各种解析器的示例,请参阅Can you provide an example of parsing HTML with your favorite parser?