1

我想剪切所有 url 之类的(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);
    }
}
4

1 回答 1

1

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

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

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

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

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

于 2009-05-18T18:18:08.440 回答