求助:C#正则表达式匹配img标签的src属性和class属性

时间:2023-01-21 05:38:56
比如一个网页有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""'<>][^"]*)

这样虽然能达到目的,但是分两次匹配,我觉得不方便,所以想一条正则表达式就搞定,但才疏学浅,希望各位大大帮帮忙……

7 个解决方案

#1


验证这种有啥目的

#2


引用 1 楼 wmq15080078423 的回复:
验证这种有啥目的

用淘宝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


引用 3 楼 q107770540 的回复:
(?is)<img(?=[^>]*?src\s*=(['"]?)(?<src>[^'"]+)\1)[^>]*?(class\s*=(['"]?)(?<class>[^'"]+)\3)?[^>]*?>

不行,匹配不到
<img src="/img/01.jpg" class="c1 c2"/> 
都匹配不了

#6


引用 4 楼 q107770540 的回复:
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
*/

谢谢,我现在用的方法是下面这种,感觉你给的要美观一点儿,现在就去改改……

/// <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


引用 1 楼 wmq15080078423 的回复:
验证这种有啥目的

用淘宝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


引用 3 楼 q107770540 的回复:
(?is)<img(?=[^>]*?src\s*=(['"]?)(?<src>[^'"]+)\1)[^>]*?(class\s*=(['"]?)(?<class>[^'"]+)\3)?[^>]*?>

不行,匹配不到
<img src="/img/01.jpg" class="c1 c2"/> 
都匹配不了

#6


引用 4 楼 q107770540 的回复:
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
*/

谢谢,我现在用的方法是下面这种,感觉你给的要美观一点儿,现在就去改改……

/// <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,都有的。