我想剪切所有网址(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\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?", 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);
}
}
答案 0 :(得分:1)
你只需要在网址前后搜索一下,看看它是否在引号中,不太可能有人将引用的网址粘贴为明文,但网址总是引用标签和文档类型。所以你的正则表达式变成了:
(^|[^'"])(http://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?)([^'"]+|$)
(^ | [^'“] +)表示字符串的开头或非引号的字符 ([^'“] | $)表示字符串结尾或不是引用
旧正则表达式周围的额外括号确保它是一个捕获组,因此您可以使用\ 2(组2)检索实际URL,而不是获取可能在URL边缘匹配的额外废话
顺便说一下,你的URL正则表达式看起来很糟糕,有更紧凑和准确的表单。你真的不需要逃避一切。