⽤正则表达式来匹配图⽚标签
最近的⽹站项⽬中有个关于⽹页取图的功能需要我⾃⼰开发,在查了⼀⼤堆资料之后,终于得到了⼀个最好的⽅案,那就是⽤正则表达式来匹配图⽚标签。
⼀般来说⼀个 HTML ⽂档有很多标签,⽐如“<html>”、“<body>”、“<table>”等,想把⽂档中的 img 标签提取出来并不是⼀件容易的事。由于 img 标签样式变化多端,使提取的时候⽤程序寻并不容易。于是想要寻它们就必须写⼀个⾮常健全的正则表达式,不然有可能会得不全,或者出来的不是正确的 img 标签。
我们可以从 HTML 标签的格式去想应该怎么建这个正则表达式。⾸先要想⼀下 img 标签有⼏种写法,忽略⼤⼩写不看的话,下⾯列出 img 标签可能出现的⼏种情况。
<img> <img/> <img src=/>
这⼀些标签不⽤考虑,因为没有图⽚资源地址。
<img src= /images/pic.jpg/ > <img src=" /images/pic.jpg" > <img src= '/images/pic.jpg ' / >
这⼀些标签都有图⽚资源地址,另外还有⼀个特点就是有引号对,可能为单引号,也可能为双引号。因为不需要同时匹配引号对,所以正则表达式可以这么写:@"<img\s*src\s*=\s*[""']? \s*(?[^\s""'<>]*)\s*/?\s*>"
<img width="320"height="240"src=/images/pic.jpg onclick="window.open('/images/pic.jpg')">
因为 img 和 src 之间可能会有其他的参数,所以“<img”要有个单词结束,⽐如说不能是“<imgabc”,同样 src 前⾯也是⼀样,使⽤单词结束符“\b”有⼀个好处就是省去了表⽰空格的“\s*”。另外由于 img 标签中不可以出现“<”、“>”这样的符号,所以要改写前⾯的正则表达式:@"<img\b[^<>]*?\bsrc\s*=\s*[""']?\s*(?<imgUrl>[^\s""'<>]*)[^<>]*?/?\s*>"
<img width="320"height="240"src= "
/images/pic.jpg" />
像这种可能会⽤回车符折⾏的问题有时候会出现,所以在有空格分开的地⽅要包含回车换⾏和 TAB 字符,另外在图⽚地址中不能出现空格、TAB、回车和换⾏字符。所以上⾯的正则表达式可以改成:@"<img\b[^<>]*? \bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>"
下⾯写出取得HTML中所有图⽚地址的静态⽅法。
/// <summary>
///取得HTML中所有图⽚的 URL。
/// </summary>
/// <param name="sHtmlText">HTML代码</param>
/// <returns>图⽚的URL列表</returns>
public static string[] GetHtmlImageUrlList(string sHtmlText)
{
// 定义正则表达式⽤来匹配 img 标签
Regex regImg = new Regex(@"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>", RegexOptions.IgnoreCase);
// 搜索匹配的字符串
MatchCollection matches = regImg.Matches(sHtmlText);
int i = 0;
string[] sUrlList = new string[matches.Count];正则匹配中配到到带单引号
// 取得匹配项列表
foreach (Match match in matches)
sUrlList[i++] = match.Groups["imgUrl"].Value;
return sUrlList;
}
该⽅法返回⼀个字符串数组,存放的就是从 sHtmlText 字符串中取得的图⽚地址列表。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。