如何在没有锚点的页面上为网址编写正确的正则表达式?

时间:2009-05-18 17:47:12

标签: asp.net asp.net-mvc regex weblogic logic

我想剪切所有网址(http://...。)并将其替换为锚点<a></a>,但我的要求是: 请勿触摸锚点和页面定义(文档类型),如:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

所以我需要找到带有url的纯文本...

我正在尝试覆盖我的内部渲染,我创建了BrowserAdapter:

<browser refID="default">
    <controlAdapters>
        <adapter controlType="System.Web.Mvc.ViewPage"
                 adapterType="Facad.Adapters.AnchorAdapter" />
    </controlAdapters>
</browser>

它看起来像这样:

public class AnchorAdapter : PageAdapter
{
    protected override void Render(HtmlTextWriter writer)
    {
        /* Get page output into string */
        var sb = new StringBuilder();
        TextWriter tw = new StringWriter(sb);
        var htw = new HtmlTextWriter(tw);

        // Render into my writer
        base.Render(htw);

        string page = sb.ToString();
        //regular expression 
        Regex regx = new Regex("http://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&amp;\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?", RegexOptions.IgnoreCase); 

        //get the first match 
        Match match = regx.Match(page); 

        //loop through matches 
        while (match.Success)
        {

            //output the match info 
            System.Web.HttpContext.Current.Response.Write("<p>url match: " + match.Groups[0].Value+"</p>");

            //get next match 
            match = match.NextMatch();
        }

        writer.Write(page);
    }
}

1 个答案:

答案 0 :(得分:1)

你只需要在网址前后搜索一下,看看它是否在引号中,不太可能有人将引用的网址粘贴为明文,但网址总是引用标签和文档类型。所以你的正则表达式变成了:

(^|[^'"])(http://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&amp;\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?)([^'"]+|$)

(^ | [^'“] +)表示字符串的开头或非引号的字符 ([^'“] | $)表示字符串结尾或不是引用

旧正则表达式周围的额外括号确保它是一个捕获组,因此您可以使用\ 2(组2)检索实际URL,而不是获取可能在URL边缘匹配的额外废话

顺便说一下,你的URL正则表达式看起来很糟糕,有更紧凑和准确的表单。你真的不需要逃避一切。