zoukankan      html  css  js  c++  java
  • 普通字符串与HTML相互转换的小经验

    做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("&", "&amp;");
                html.Replace(" ", "&nbsp;");
                html.Replace("<", "&lt;");
                html.Replace(">", "&gt;");
                html.Replace("\"", "&quot;");

                if (identiftyURL)
                {
                    Regex linkRegex = new Regex("(http://|www)[\\S]{5,}(?=&nbsp;|\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("&quot;", "\"");
                normalStr.Replace("&lt;", "<");
                normalStr.Replace("&gt;", ">");
                normalStr.Replace("&nbsp;", " ");
                normalStr.Replace("&amp;", "&");

                return normalStr.ToString();
            }

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zwei1121/archive/2006/04/28/694498.aspx

  • 相关阅读:
    201621123060《JAVA程序设计》第九周学习总结
    201621123060《JAVA程序设计》第八周学习总结
    网络1712--c语言第二次作业总结
    Linux笔记
    Python-Flask框架之"图书管理系统"项目,附详解源代码及页面效果截图
    CentOS7防火墙firewall
    Linux文件处理三剑客(grep、sed、awk)
    OpenStack、虚拟机以及和当前流行的k8s、Docker四者之间的关系
    反向代理与正向代理的区别
    本地虚拟机在NAT网络连接模式下如何设置才可以访问外网以及使用Xshell远程连接
  • 原文地址:https://www.cnblogs.com/liufei88866/p/1523967.html
Copyright © 2011-2022 走看看