首页新闻找找看学习计划

C#中如何有效地检测内容中是否有大量链接

0
悬赏园豆:200 [已解决问题] 解决于 2015-04-17 15:13

链接样本特征:

1)

特征:

<a href="url">url</a> ...

示例:

<a href="http://q.cnblogs.com/q/71241/">http://q.cnblogs.com/q/71241/</a><a href="http://q.cnblogs.com/q/71241/">http://q.cnblogs.com/q/71241/</a><a href="http://q.cnblogs.com/q/71241/">http://q.cnblogs.com/q/71241/</a><a href="http://q.cnblogs.com/q/71241/">http://q.cnblogs.com/q/71241/</a><a href="http://q.cnblogs.com/q/71241/">http://q.cnblogs.com/q/71241/</a>

2)

特征: 

<a href="url">文本</a> ...

示例:

<a href="http://q.cnblogs.com/q/71241/">测试</a><a href="http://q.cnblogs.com/q/71241/">测试</a><a href="http://q.cnblogs.com/q/71241/">测试</a><a href="http://q.cnblogs.com/q/71241/">测试</a><a href="http://q.cnblogs.com/q/71241/">测试</a>

3)

特征:

url url url ...

示例a:

q.cnblogs.com/q/71241 q.cnblogs.com/q/71241/ q.cnblogs.com/q/71241/ q.cnblogs.com/q/71241/ q.cnblogs.com/q/71241/

示例b: 

http://q.cnblogs.com/q/71241 q.cnblogs.com/q/71241/http://q.cnblogs.com/q/71241/http://q.cnblogs.com/q/71241/http://q.cnblogs.com/q/71241/

请问在C#辊如何检测一段文本中是否包含这些链接样本,若包含,需要显示链接数?

C#
dudu的主页 dudu | 高人七级 | 园豆:39099
提问于:2015-04-15 10:39
< >
分享
最佳答案
0

第一第二 可以通过 <a> 的正则

第三种可以这样来

 

(([^/]*\.)+([^/]*))/([^\.]*/)+([^\.]*)?((?=\1|$))

 

前提是同域名的

收获园豆:200
Yu | 专家六级 |园豆:12944 | 2015-04-15 17:40

实际场景是域名经常变化

dudu | 园豆:39099 (高人七级) | 2015-04-15 17:44

@dudu: 第三种场景的域名可能会不一致?

Yu | 园豆:12944 (专家六级) | 2015-04-15 17:50

@Yu: 在同一段文本中域名是一致的

dudu | 园豆:39099 (高人七级) | 2015-04-15 17:55

@dudu: 那就可以了

Yu | 园豆:12944 (专家六级) | 2015-04-15 17:56

@Yu: 你这个在域名前面有http://的时候就不能匹配

dudu | 园豆:39099 (高人七级) | 2015-04-15 17:58

@dudu: 

 

((http://)?([^/]*\.)+([^/]*))(/([^\.]*/?)+([^\.]*)?)?((?=\1|$))

Yu | 园豆:12944 (专家六级) | 2015-04-15 18:02

@Yu: 这个正则在测试中会造成程序运行死锁

dudu | 园豆:39099 (高人七级) | 2015-04-15 18:12

@dudu: 你的测试数据咋样的

Yu | 园豆:12944 (专家六级) | 2015-04-15 19:01

@Yu: 

var regex = new Regex(@"((http://)?([^/]*\.)+([^/]*))(/([^\.]*/?)+([^\.]*)?)?((?=\1|$))");
var text = "http://q.cnblogs.com/1210768968~-1/155557840_155557840.htm";
var maches = regex.Matches(text);
dudu | 园豆:39099 (高人七级) | 2015-04-15 23:01

@dudu: 

((http://)([^/\s]*\.)+([^/\s]*)|([^/\s]*\.)+([^/\s]*))(/[^\.\s(http:)/]+(\.htm(l)?)?(?!\.))*

Yu | 园豆:12944 (专家六级) | 2015-04-16 09:48

@Yu: 这个测试通过

dudu | 园豆:39099 (高人七级) | 2015-04-16 10:32
其他回答(8)
0

1、正则;

2、自己写个 html 解析器,只解析 <a href 标签。

Launcher | 园豆:45040 (高人七级) | 2015-04-15 10:42

html解析器不能处理第3种情况

支持(0) 反对(0) dudu | 园豆:39099 (高人七级) | 2015-04-15 10:48

@dudu: 第三种是啥情况?举个例子看看。

支持(0) 反对(0) Launcher | 园豆:45040 (高人七级) | 2015-04-15 10:45

@Launcher: 

如下:

q.cnblogs.com/q/71241 q.cnblogs.com/q/71241/ q.cnblogs.com/q/71241/ q.cnblogs.com/q/71241/ q.cnblogs.com/q/71241/

有时多个url之间边空格都没有

支持(0) 反对(0) dudu | 园豆:39099 (高人七级) | 2015-04-15 10:51

@dudu: 

没空格的话神仙也不能自动识别呀!

支持(0) 反对(0) XiaoFaye | 园豆:3082 (老鸟四级) | 2015-04-15 10:58

@dudu: 那你这个问题就难了,你还需要解析 URI,考察这两个例子:

q.cnblogs.com/q/71241 q.cnblogs.com/q/71241/

因为有空格,那么根据 URI 的规则,可以分割成两个独立的字符串来做 URI 分析。

q.cnblogs.com/q/71241q.cnblogs.com/q/71241/

因为没有空格,那么根据 URI 规则,它可以拆分成下面两个合法 URI

q.cnblogs.com/q/71241q.c 和 nblogs.com/q/71241/

 

你可以定期的加入一些规则,比如 q.cnblogs.com 为 URI 中的 userinfo+host+port 节,那么从 / 后的部分就可能为 path 节。

支持(0) 反对(0) Launcher | 园豆:45040 (高人七级) | 2015-04-15 11:05

@Launcher: 准备用.com/这个特征试试效果

支持(0) 反对(0) dudu | 园豆:39099 (高人七级) | 2015-04-15 17:03
0

正则

````` | 园豆:14268 (专家六级) | 2015-04-15 10:47
0

1、$("a")

2、$("a").length

丢了幸福的猪227 | 园豆:261 (菜鸟二级) | 2015-04-15 10:48
0

关键字匹配行不行呢?

幻天芒 | 园豆:36522 (高人七级) | 2015-04-15 10:50

URL指向的都是正规网站

支持(0) 反对(0) dudu | 园豆:39099 (高人七级) | 2015-04-15 10:56

@dudu: 对呀,我是指url的关键字。 比如1、2中:<a href="

3中:数字字符.数字字符(q.cnblogs.com)。

支持(0) 反对(0) 幻天芒 | 园豆:36522 (高人七级) | 2015-04-15 11:12

@幻天芒: URL没有规律,不同的网站,不同的URL形式

支持(0) 反对(0) dudu | 园豆:39099 (高人七级) | 2015-04-15 11:23

@dudu: 没有规律,就要人工添加规则去匹配吧。

支持(0) 反对(0) 幻天芒 | 园豆:36522 (高人七级) | 2015-04-15 11:34

@幻天芒: 只是关键字上没有规律

支持(0) 反对(0) dudu | 园豆:39099 (高人七级) | 2015-04-15 11:45

@dudu: 字符、点就是关键哇,看需求是是否包含大量链接,那只需要判断多不多就行了。

支持(0) 反对(0) 幻天芒 | 园豆:36522 (高人七级) | 2015-04-15 11:49

@幻天芒: 特征字符有域名后缀(.com,.net...)、斜杠、点,只要知道数量就行了

支持(0) 反对(0) dudu | 园豆:39099 (高人七级) | 2015-04-15 11:56

@dudu: 直接搜索特征字符数量。

支持(0) 反对(0) 幻天芒 | 园豆:36522 (高人七级) | 2015-04-15 12:30
0

既然是大量,那应该可以通过判断重复字符串来做吧?

吴瑞祥 | 园豆:28729 (高人七级) | 2015-04-15 11:15
0

主要还是判断是否包含域名吧? a.b.com之类的

iImax | 园豆:3138 (老鸟四级) | 2015-04-15 15:04
0

1.正则替换法

http://www.cnblogs.com/diony/archive/2010/12/16/1908499.html

2.关键字过滤

小眼睛老鼠 | 园豆:2774 (老鸟四级) | 2015-04-15 16:55
0

mark!

天琊蓝 | 园豆:188 (初学一级) | 2015-04-15 23:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册