比如一个网页有img标签如下形式:
<img src="/img/01.jpg" class="c1 c2"/>
要求一条正则匹配img标签的src属性和class属性,
src 和 class 的顺序不是固定的,可能是:
<img class="c1 c2" src="/img/01.jpg" />
也可能是:
<img data-other="abc" class="c1 c2" src="/img/01.jpg" />
或者是:
<img class="c1 c2" data-other="abc" src="/img/01.jpg" />
等等……
唯一能确定的就是:
1.一定是img标签
2.一定有src属性
3.不一定有class属性
4.各个属性的顺序是不一定的
——————————————————————————
目前我的处理办法是:
1.匹配img标签和src属性
<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>
2.然后再匹配class属性
class[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgClass>[^\s\t\r\n""'<>][^"]*)
这样虽然能达到目的,但是分两次匹配,我觉得不方便,所以想一条正则表达式就搞定,但才疏学浅,希望各位大大帮帮忙……
C#正则表达式分组匹配
<img src="/img/01.jpg" class="c1 c2"/>
要求一条正则匹配img标签的src属性和class属性,
src 和 class 的顺序不是固定的,可能是:
<img class="c1 c2" src="/img/01.jpg" />
也可能是:
<img data-other="abc" class="c1 c2" src="/img/01.jpg" />
或者是:
<img class="c1 c2" data-other="abc" src="/img/01.jpg" />
等等……
唯一能确定的就是:
1.一定是img标签
2.一定有src属性
3.不一定有class属性
4.各个属性的顺序是不一定的
——————————————————————————
目前我的处理办法是:
1.匹配img标签和src属性
<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>
2.然后再匹配class属性
class[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgClass>[^\s\t\r\n""'<>][^"]*)
这样虽然能达到目的,但是分两次匹配,我觉得不方便,所以想一条正则表达式就搞定,但才疏学浅,希望各位大大帮帮忙……
C#正则表达式分组匹配
然后我想在我的程序上是这样显示的
<img src="这里可能用他原来的链接或别的什么,所以我要获取src属性" class="我自己的样式,如果他之前没有class属性的话,我就加上我自己的,如果他原来已经有了的话,我就再他后面追加我的样式,所以我要获取class属性"/>
{
string[] ary=
{
@"<img src=""/img/01.jpg"" />",
@"<img class=""c1 c2"" src=""/img/01.jpg"" />",
@"<img src=""/img/01.jpg"" class=""c1 c2"" />",
@"<img class=""c1 c2"" src=""/img/01.jpg"" />",
@"<img data-other=""abc"" class=""c1 c2"" src=""/img/01.jpg"" />",
@"<img class=""c1 c2"" data-other=""abc"" src=""/img/01.jpg"" />"
};
Regex regSimple=new Regex(@"(?i)<img\b[^>]*?src\s*=(['""]?)(?<src>[^'""]+)\1[^>]*?>");
Regex reg=new Regex(@"(?i)<img\b(?=[^>]*?src\s*=(['""]?)(?<src>[^'""]+)\1)[^>]*?(class\s*=(['""]?)(?<class>[^'""]+)\3)[^>]*?>");
foreach(string s in ary)
{
if(reg.IsMatch(s))
{
Match m =reg.Match(s);
Console.WriteLine("{0}\t{1}",m.Groups["src"].Value,m.Groups["class"].Value);
}
else
{
Match m =regSimple.Match(s);
Console.WriteLine("{0}",m.Groups["src"].Value);
}
}
}
/*
/img/01.jpg
/img/01.jpg c1 c2
/img/01.jpg c1 c2
/img/01.jpg c1 c2
/img/01.jpg c1 c2
/img/01.jpg c1 c2
*/
<img src="/img/01.jpg" class="c1 c2"/>
都匹配不了
/// 格式化商品描述
/// </summary>
/// <param name="htmlHelper"></param>
/// <param name="desc">商品描述</param>
/// <returns></returns>
public static MvcHtmlString FormatDesc(this HtmlHelper htmlHelper, string desc)
{
if (!string.IsNullOrWhiteSpace(desc))
{
//<img[^<]*?(class[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*[^\s\t\r\n""'<>][^"]*)[^<>]*?/?[\s\t\r\n]*>
//<img[^<]*?(src[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>
desc = Regex.Replace(desc, @"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>", new MatchEvaluator(GetNewImageTag));
}
return new MvcHtmlString(desc);
}//替换Img
private static string GetNewImageTag(Match match)
{
string matchValue = match.Value; try
{
//从image 标签中匹配出URL <img src="http://img03.taobaocdn.com/imgextra/i3/692195348/T2yTGZXm0XXXXXXXXX_!!692195348.jpg">
//标记
var = "qwertyuiopasdfghjklzxcvbnmqwertyuiopasdfghjklzxcvbnm";
//整个Img标签
var img = match.Value;
//检查是否有class属性
Match matchImgClass = Regex.Match(img, @"class[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgClass>[^\s\t\r\n""'<>]*)");
var imgClass = matchImgClass.Groups["imgClass"].Value;
//Img标签的 src属性
var url = match.Groups["imgUrl"].Value;
string imgStr = string.Empty;
imgStr+="<img ";
//如果有class
if (!string.IsNullOrWhiteSpace(imgClass))
{
matchValue = matchValue.Replace(imgClass, imgClass + " lazy img-responsive");
}
else
{
imgStr+=" class=\"lazy img-responsive\" ";
}
imgStr+=" data-original=\"" + + "\" "; //matchValue = matchValue.Replace("<img", "<img class=\"lazy img-responsive\" data-original=\"" + + "\"");
matchValue = matchValue.Replace("<img", imgStr);
matchValue = matchValue.Replace(url, "/Content/Images/preloader-w8-cycle-black.gif");
matchValue = matchValue.Replace(, url);
matchValue += "<noscript>" + img + "</noscript>";
}
catch
{ } return matchValue;
}