首页 新闻 会员 周边 捐助

正则如何批量替换网页中的标签内容不复制

0
悬赏园豆:50 [已解决问题] 解决于 2018-11-22 11:11

c# 批量替换源码中的图片地址,后面的文件名不变只替换前面的 http 到 图片名前面的 / 这个正则怎么写,

原始代码如下:

<img src=https://www.abc.com/wp-content/uploads/2017/03/MAMP-PRO.png alt="alt内容" /><span class="entry-meta">

<img src=https://efg.com/wp-content/uploads/2017/03/Twixl-Publisher.png alt="alt内容" /></a>

我要把 src=xxxx 的替换掉 然后 /MAMP-PRO.png 以后的内容保持不变,
也就是批量替换中间的这一串,https://www.abc.com/wp-content/uploads/2017/03 后面的图片名有上百个,每个都不同,这个正则该怎么写,

使用下面这句虽可以替换,但是正则写的有问题,导致所有的图片变成了一个结果,小弟正则不精,麻烦各路高手帮忙解决下,或者有什么其它方法进行替换。
Regex.Replace(richTextBox1.Text, "(?<=<img src=)[\s\S]*?(?= alt)", "www.aaa.com");

lixia7的主页 lixia7 | 初学一级 | 园豆:6
提问于:2018-11-18 22:56
< >
分享
最佳答案
0

var repacedHtml = System.Text.RegularExpressions.Regex.Replace(html, @"(?<=<img\s+?src=).+?(?=\s)", m =>
{
var src = m.Value.TrimStart('"').TrimEnd('"');
var fileName = System.IO.Path.GetFileName(src);
return string.Format(""/{0}"", fileName);
});

自己慢慢体会吧,(sb cnblogs回复代码自动被修改有BUG)

收获园豆:50
jiulang | 菜鸟二级 |园豆:437 | 2018-11-21 23:22

。。。谢谢帮忙了。不过只提取图片这我知道,我是想取src=至图片名中间的地址

如:src=(这是我想匹配的地址)/图片.jpg
我是想弄个能提取中间地址的正则,因为要把这些地址全部替换掉,而图片片是要保留的,最后再返回回处理过后的源码,因为匹配的结果是个集合,我用 Regex.Replace() 进行替换会使这个过程重复执行,而地址全部会变成一样,就像下面这个结果一样,图片名变成了死的

或者有什么其它的方法能实现我这功能,把html源码里的图片地址批量更改,

lixia7 | 园豆:6 (初学一级) | 2018-11-22 00:29
其他回答(3)
0

将图片存到数组中,用for或foreach循环取数组中的数据

正则表达式生成工具

徒然喜欢你 | 园豆:1741 (小虾三级) | 2018-11-19 08:20

本身我匹配正则得结果就是在集合中的,我通过下图这种方式能成功,但是所有匹配出的图片却变了一样

支持(0) 反对(0) lixia7 | 园豆:6 (初学一级) | 2018-11-19 12:24
0

你风致 | 园豆:2215 (老鸟四级) | 2018-11-19 11:29

没看明白,这个是放在哪,我是需要先把网页中的所有图片地址找出来,然后替换之些地址,但是图片名字是需要不变的,前变图片名前面的地址,而地址的格式也是不同的,

如:
<img src="http://www.baidu.com/img.png"><span>test</span
<a href="#"><img src="http://www.baidu.com/aaa/123.png"></a>
<img src="www.baidu.com/aaa/123/user.png">
<img src=http://www.bbb.com/img.png alt="" width="">

图片名我要留着,前面地址则需要替换,

支持(0) 反对(0) lixia7 | 园豆:6 (初学一级) | 2018-11-19 12:32

得到结果:src="www.aaa.com/MAMP-PRO.png"
这只是一个小demo,你要替换成什么,你就在“src=“此处写你想替换成什么内容“
注意"要转义

支持(0) 反对(0) 你风致 | 园豆:2215 (老鸟四级) | 2018-11-19 14:20

@心悠魂然: ...兄弟,没看明白问题吗,一个网页里有几十个图片,我替换的是图片名前面的地址,你这方法是把所有图片地址都换成了一个,连图片名也给写死了,我要的是图片名保持原样不动,只替换图片名前面 / 的所有地址,而且地址也是没有规律的,如我之前回身你的那些 img 地址一样。

支持(0) 反对(0) lixia7 | 园豆:6 (初学一级) | 2018-11-19 15:13

@lixia7: 何时动过你的图片名?替换的是/以前的内容,图片名还在原处保留,并未修改。
前面的地址不一样,你只能自己把图片取出来循环遍历,再一一替换成你所需的地址了;我还以为是你的地址都是一样的,只是需要替换。
你可以把你要替换成的地址先存起来。用时再取。

支持(0) 反对(0) 你风致 | 园豆:2215 (老鸟四级) | 2018-11-19 15:24

@心悠魂然: 行不通,不知道是不是我写的有问题,读的地址本身就放在了 MatchCollection 中,如果能单独的提取出图片的 http://www.baidu.com/ 这部分,保留文件名就很好解决,
<img src="http://www.baidu.com/img.png"><span>test</span

======================================
string html = richTextBox1.Text; //源码
string temp = "";
string rule = "(?<="><img src=)[\s\S]?(?= alt)";
//string rule = "(?<=<img class="service-action-img" src=").
?(?=")";

        Regex reg = new Regex(rule);
        MatchCollection coll = reg.Matches(richTextBox1.Text); //得到匹配

        foreach (Match item in coll)
        {
            string code = item.Value; //初始地址
            temp = item.Value;

            temp = code.Substring(code.LastIndexOf("/")).Replace("/", string.Empty); //分割文件名
            string path = "www.baidu.com/images/";
            string imgurl = path + temp; 
            richTextBox2.Text = Regex.Replace(html,rule,path+temp);//替换
        }

====================

支持(0) 反对(0) lixia7 | 园豆:6 (初学一级) | 2018-11-19 16:32
0

源数据:
https://www.abc.com/wp-content/uploads/2017/03/MAMP-PRO.png
https://efg.com/wp-content/uploads/2017/03/Twixl-Publisher.png
http://efg.com/wp-content/uploads/2017/03/Twixl-Publisher.png

正则:https?://.*/
匹配结果:
共找到 3 处匹配:
https://www.abc.com/wp-content/uploads/2017/03/
https://efg.com/wp-content/uploads/2017/03/
http://efg.com/wp-content/uploads/2017/03/

====================
楼主也可以直接获取src的全部值,然后用last的斜线/分割,然后存入字典,循环替换。

荆棘人 | 园豆:410 (菜鸟二级) | 2018-11-20 19:03

..虽然是正确的,只不过一张网页不止这几个链接,还有a,link,script等各种标签,
如这个地址的源码:https://q.cnblogs.com/q/111210/ 找到图片地址,保留图片名就完美了,

不过这个正则琢磨了一阵子。。。没弄出来

支持(0) 反对(0) lixia7 | 园豆:6 (初学一级) | 2018-11-20 20:19

正确的正则:(?<=src=")([^\/\s]*/)+

支持(0) 反对(0) lixia7 | 园豆:6 (初学一级) | 2018-11-22 11:12
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册