一个简单的算法,最好能结合正则表达式完整实现 本帖最后由 panwl83 于 2013-08-15 00:37:51 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这个算法其实是一个处理字符串内容中含有本站(www.abc.com)之外域名的方法主要处理两种文本一种是含有超链文本如:<a href='http://www.aaa.com'>aaa</a>、<a href='http://www.bbb.com'>bbb</a>一种是含有网址纯文本如:www.aaa.com、www.bbb.net、www.ccc.cn、www.abc.org等等分析,两种情况处理关于超链文的处理希望返回的结果是仅保留<a href='http://www.abc.com'>abc</a>关于网址纯文本处理希望返回结果是仅保留www.abc.com输入一串字符串分两次处理先过滤掉不符合规则的超链文本,再过滤掉不符合规则的网址纯文本这样应该能返回要的结果 自己看精通正则表达式第二版网上有PDF电子书 (?is)(<a[^>]*?href=(["'])?(http://www\.((?!abc)\w)+\.com[^"']*?)\1[^>]*?>.*?</a>|http://www\.((?!abc)\w)+\.com[^"']*?|www\.((?!abc)\w)+\.com) protected void Page_Load(object sender, EventArgs e) { string iniStr = @"<a href='http://www.aaa.com/sadf/aaa.asp'>过滤一</a>asdf<a href='http://www.bbb.com'>过滤二</a><a href='http://www.abc.com'>abc网</a>afad www.bbb.com sdf www.abc.com"; string filterword = iniStr; Response.Write(HttpUtility.HtmlEncode(filterword)); Response.Write("<br/>"); //过滤外链 string s = iniStr; MatchEvaluator me = new MatchEvaluator(ABC); string r = Regex.Replace(s, @"(?is)<a[^>]*href=([""'])(?<href>.*?)\1>.*?</a>", me); //再过滤 filterword = FilterLinkExcept(r); Response.Write(HttpUtility.HtmlEncode(filterword)); //输出结果 //asdf<a href='http://www.abc.com'>abc网</a>afad sdf www.abc.com } /// <summary> /// 仅保留www.abc.com超链文本 /// </summary> /// <param name="match"></param> /// <returns></returns> private string ABC(Match match) { if (!match.Groups["href"].Value.ToLower().Contains("www.abc.com")) return ""; else return match.Value; } /// <summary> /// 仅保留www.abc.com网址文本 /// </summary> /// <param name="text"></param> /// <returns></returns> public static string FilterLinkExcept(string text) { string validStr = ""; //(?is)(<a[^>]*?href=(["'])?(http://www\.((?!abc)\w)+\.com[^"']*?)\1[^>]*?>.*?</a>|http://www\.((?!abc)\w)+\.com[^"']*?|www\.((?!abc)\w)+\.com) Regex reg = new Regex(@"www\.((?!abc)\w)+\.com"); validStr = reg.Replace(text, ""); return validStr; } 上面是网上平凑实现。多谢@伤脑筋实际应用中iniStr长度nvarchar(5000)问题:不知道还有没有更高性能方案或者更漂亮的写法 建立一个库,将要替换的内容都扔进库里面,每次使用前replace一下即可。 为什么C#用微软语音引擎朗读文件时整个窗口都处于瘫痪状态 求VS2010的C#的一个简单的应用程序 本人初学,问个有关进程的问题 JS求解~~~~~小问题~ 跪求 实用软件 开发源码!!! c#控件(StatusBar)的时间显示问题 Excel Application 問題 大家有没有参加过东软的培训的,到底怎么样?给小弟一些意见吧! log4net输出到DB2的问题 那里有programming c#下载? 关于gridcontrol中主从表从表的显示问题 请孟子E章,版主等大佬,进来回答一下我的疑问。
主要处理两种文本
一种是含有超链文本如:<a href='http://www.aaa.com'>aaa</a>、<a href='http://www.bbb.com'>bbb</a>
一种是含有网址纯文本如:www.aaa.com、www.bbb.net、www.ccc.cn、www.abc.org等等
分析,两种情况处理
关于超链文的处理希望返回的结果是仅保留<a href='http://www.abc.com'>abc</a>
关于网址纯文本处理希望返回结果是仅保留www.abc.com输入一串字符串分两次处理先过滤掉不符合规则的超链文本,再过滤掉不符合规则的网址纯文本
这样应该能返回要的结果
{
string iniStr = @"<a href='http://www.aaa.com/sadf/aaa.asp'>过滤一</a>asdf<a href='http://www.bbb.com'>过滤二</a><a href='http://www.abc.com'>abc网</a>afad www.bbb.com sdf www.abc.com";
string filterword = iniStr;
Response.Write(HttpUtility.HtmlEncode(filterword));
Response.Write("<br/>");
//过滤外链
string s = iniStr;
MatchEvaluator me = new MatchEvaluator(ABC);
string r = Regex.Replace(s, @"(?is)<a[^>]*href=([""'])(?<href>.*?)\1>.*?</a>", me);
//再过滤
filterword = FilterLinkExcept(r);
Response.Write(HttpUtility.HtmlEncode(filterword));
//输出结果
//asdf<a href='http://www.abc.com'>abc网</a>afad sdf www.abc.com
} /// <summary>
/// 仅保留www.abc.com超链文本
/// </summary>
/// <param name="match"></param>
/// <returns></returns>
private string ABC(Match match)
{
if (!match.Groups["href"].Value.ToLower().Contains("www.abc.com"))
return "";
else return match.Value;
} /// <summary>
/// 仅保留www.abc.com网址文本
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
public static string FilterLinkExcept(string text)
{
string validStr = "";
//(?is)(<a[^>]*?href=(["'])?(http://www\.((?!abc)\w)+\.com[^"']*?)\1[^>]*?>.*?</a>|http://www\.((?!abc)\w)+\.com[^"']*?|www\.((?!abc)\w)+\.com)
Regex reg = new Regex(@"www\.((?!abc)\w)+\.com");
validStr = reg.Replace(text, "");
return validStr;
}
多谢@伤脑筋
实际应用中iniStr长度nvarchar(5000)
问题:
不知道还有没有更高性能方案或者更漂亮的写法