您的位置:首页 > Web前端 > HTML

普通字符串与HTML相互转换的小经验

2009-07-15 11:34 288 查看
做Web应用时经常会遇到需要用户输入文本,并且留待以后可以编辑的情况。这时候我们就不得不考虑用户输入的文本中是不是会包含HTML中的关键字的问题。
去除HTML关键字我的办法是替换成转义字符,然后需要编辑时再把转义字符转换回来。这个步骤直接用Replace就可以,不再多说。
这里主要是讲自动识别URL的问题,比如用户输入:www.google.com 时自动加上超级链接标签,需要编辑时再把标签去掉。
关于这个问题我的解决办法是使用正则表达式匹配,然后截取网址用于插入超级链接标签,转换回来时也用正则表达式匹配,然后去除标签。
我刚开始用于匹配网址的表达式是:(http://|www)[\S]{5,} 这个表达式看似可以,但是在实际应用时空个符和回车换行符会先被转为HTML转义字符串,这时候这个表达式匹配出来的结果就变成不是我们所要的了。
后来我改成了 (http://|www)[\S]{5,}(?: ) 这个表达式解决了上面所说的问题,但是测试时才发现有时候网址是写在行的结尾的或者文章结尾的,这时候就匹配不了了。并且这个表达式会捕捉到网址末尾的 这样造成生成超级链接时出错。参看了网上的正则表达式语法,明明是说(?:str)是不会捕捉str的,怎么回事呢?到现在我也没搞明白。
最后我写成 (http://|www)[\S]{5,}(?= |\r\n) 就OK了,(?= str)就真的不会捕捉里面的字符串。
去处超级链接的正则表达式就比较简单,我的写法是:(<a href=\")[\\S]{5,}(\">)|</a> 用它匹配然后用空字符替换匹配的文本就起到去处作用了。
具体的程序代码如下:

/**//// <summary>
///将字符串格式化为HTML
/// </summary>
/// <param name="normalStr">所要格式化的字符串</param>
/// <param name="identiftyURL">是否自动识别URL,识别出来的URL将会自动加上超级链接标签</param>
/// <returns>返回格式化后的HTML代码</returns>
public static string FormatToHTML(string normalStr, bool identiftyURL)
{
StringBuilder html = new StringBuilder(normalStr);

html.Append(' ');
html.Replace("&", "&");
html.Replace(" ", " ");
html.Replace("<", "<");
html.Replace(">", ">");
html.Replace("\"", """);

if (identiftyURL)
{
Regex linkRegex = new Regex("(http://|www)[\\S]{5,}(?= |\r\n)");

MatchCollection regMathes = linkRegex.Matches(html.ToString());

int add = 0;

foreach (Match match in regMathes)
{
string head = string.Format("<a href=\"{0}\">", match.Value[0] == 'h' ? match.Value : "http://" + match.Value);

html.Insert(match.Index + add, head);
add += head.Length;

html.Insert(match.Index + match.Length + add, "</a>");
add += 3;
}
}

html.Replace("\r\n", "<br />");

return html.ToString();
}

/**//// <summary>
/// 将HTML转为普通文本格式
/// </summary>
/// <param name="htmlStr">所要转换的HTML字符串</param>
/// <param name="identiftyURL">是否自动识别URL,自动识别URL会自动去处HTML代码中的超级链接标签</param>
/// <returns>返回普通文本</returns>
public static string UnFormatHTML(string htmlStr, bool identiftyURL)
{
StringBuilder normalStr = new StringBuilder(htmlStr);

normalStr.Replace("<br />", "\r\n");

if (identiftyURL)
{
Regex linkRegex1 = new Regex("(<a href=\")[\\S]{5,}(\">)|</a>");

normalStr= new StringBuilder(linkRegex1.Replace(normalStr.ToString(), ""));
}

normalStr.Replace(""", "\"");
normalStr.Replace("<", "<");
normalStr.Replace(">", ">");
normalStr.Replace(" ", " ");
normalStr.Replace("&", "&");

return normalStr.ToString();
}

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zwei1121/archive/2006/04/28/694498.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: