<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""'<>][^"]*)
这样虽然能达到目的,但是分两次匹配,我觉得不方便,所以想一条正则表达式就搞定,但才疏学浅,希望各位大大帮帮忙……
7 个解决方案
#1
验证这种有啥目的
#2
用淘宝AIP获取商品信息,商品描述里有图片,类似<img src="/img/01.jpg">,但不仅限于这种,
然后我想在我的程序上是这样显示的
<img src="这里可能用他原来的链接或别的什么,所以我要获取src属性" class="我自己的样式,如果他之前没有class属性的话,我就加上我自己的,如果他原来已经有了的话,我就再他后面追加我的样式,所以我要获取class属性"/>
#3
(?is)<img(?=[^>]*?src\s*=(['"]?)(?<src>[^'"]+)\1)[^>]*?(class\s*=(['"]?)(?<class>[^'"]+)\3)?[^>]*?>
#4
void Main()
{
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
*/
#5
不行,匹配不到
<img src="/img/01.jpg" class="c1 c2"/>
都匹配不了
#6
谢谢,我现在用的方法是下面这种,感觉你给的要美观一点儿,现在就去改改……
/// <summary>
/// 格式化商品描述
/// </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 mark = "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=\"" + mark + "\" ";
//matchValue = matchValue.Replace("<img", "<img class=\"lazy img-responsive\" data-original=\"" + mark + "\"");
matchValue = matchValue.Replace("<img", imgStr);
matchValue = matchValue.Replace(url, "/Content/Images/preloader-w8-cycle-black.gif");
matchValue = matchValue.Replace(mark, url);
matchValue += "<noscript>" + img + "</noscript>";
}
catch
{
}
return matchValue;
}
#7
上面的代码,是可以用的。我获取 img 和 src,都有的。
#1
验证这种有啥目的
#2
用淘宝AIP获取商品信息,商品描述里有图片,类似<img src="/img/01.jpg">,但不仅限于这种,
然后我想在我的程序上是这样显示的
<img src="这里可能用他原来的链接或别的什么,所以我要获取src属性" class="我自己的样式,如果他之前没有class属性的话,我就加上我自己的,如果他原来已经有了的话,我就再他后面追加我的样式,所以我要获取class属性"/>
#3
(?is)<img(?=[^>]*?src\s*=(['"]?)(?<src>[^'"]+)\1)[^>]*?(class\s*=(['"]?)(?<class>[^'"]+)\3)?[^>]*?>
#4
void Main()
{
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
*/
#5
不行,匹配不到
<img src="/img/01.jpg" class="c1 c2"/>
都匹配不了
#6
谢谢,我现在用的方法是下面这种,感觉你给的要美观一点儿,现在就去改改……
/// <summary>
/// 格式化商品描述
/// </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 mark = "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=\"" + mark + "\" ";
//matchValue = matchValue.Replace("<img", "<img class=\"lazy img-responsive\" data-original=\"" + mark + "\"");
matchValue = matchValue.Replace("<img", imgStr);
matchValue = matchValue.Replace(url, "/Content/Images/preloader-w8-cycle-black.gif");
matchValue = matchValue.Replace(mark, url);
matchValue += "<noscript>" + img + "</noscript>";
}
catch
{
}
return matchValue;
}
#7
上面的代码,是可以用的。我获取 img 和 src,都有的。