我发现了一些使用正则表达式检测文本段落中URL的模式并添加HTML代码以使其成为链接的示例。我对这种方法的问题在于,有时输入段落包含以纯文本(我想转换为可点击)的URL,还有一些已经有链接标记的URL。例如,请考虑以下段落:
My favourite search engine is http://www.google.com but
sometimes I also use <a href="http://www.yahoo.com">http://www.yahoo.com</a>
我只想转换Google链接,但保留两条Yahoo链接。
我所追求的是一个C#函数,它使用正则表达式来检测URL并对其进行转换但忽略了包含“A”标记标记或已经包含在“A”标记内的URL。
修改
这是我到目前为止所做的:
PostBody = "My favourite search engine is http://www.google.com but sometimes I also use <a href=\"http://www.yahoo.com\">http://www.yahoo.com</a>";
String pattern = @"http(s)?://([\w+?\.\w+])+([a-zA-Z0-9\~\!\@\#\$\%\^\&\*\(\)_\-\=\+\\\/\?\.\:\;\'\,]*)?";
System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(pattern);
System.Text.RegularExpressions.MatchCollection matches = regex.Matches(PostBody);
for (int i = 0; i < matches.Count; i++)
{
PostBody = PostBody.Replace(matches[i].Value, String.Format("<a href=\"{0}\">{1}</a>", matches[i].Value, matches[i].Value));
}
ltrlPostBody.Text = PostBody;
以下是我得到的内容(为了清晰起见,我将其拆分为多行):
My favourite search engine is
<a href="http://www.google.com">http://www.google.com</a>
but sometimes I also use
<a href="<a href="<a href="http://www.yahoo.com">http://www.yahoo.com</a>">
<a href="http://www.yahoo.com">http://www.yahoo.com</a></a>">
我只想转换第一个链接(在本例中),因为它还没有成为链接标记的一部分。
答案 0 :(得分:3)
你也可以使用HTML Agility Pack,这会给你更多力量(例如你不想逃避
<script></script>
元素和样式元素:
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using HtmlAgilityPack;
namespace ConsoleApplication3 {
class Program {
static void Main(string[] args) {
var text = @"My favourite search engine is http://www.google.com but
sometimes I also use <a href=""http://www.yahoo.com"">http://www.yahoo.com</a>
<div>http://catchme.com</div>
<script>
var thisCanHurt = 'http://noescape.com';
</script>";
var doc = new HtmlDocument();
doc.LoadHtml(text);
var regex = new Regex(@"http(s)?://([\w+?\.\w+])+([a-zA-Z0-9\~\!\@\#\$\%\^\&\*\(\)_\-\=\+\\\/\?\.\:\;\'\,]*)?", RegexOptions.IgnoreCase);
var nodes = doc.DocumentNode.SelectNodes("//text()");
foreach (var node in nodes) {
if (node.ParentNode != null && (node.ParentNode.Name == "a" || node.ParentNode.Name == "script" || node.ParentNode.Name == "style")) {
continue;
}
node.InnerHtml = regex.Replace(node.InnerText, (match) => {
return string.Format(@"<a href=""{0}"">{0}</a>", match.Value);
});
}
var builder = new StringBuilder(100);
using (var writer = new StringWriter(builder)) {
doc.Save(writer);
}
var compose = builder.ToString();
}
}
}
答案 1 :(得分:2)
如果您已经编写了正则表达式以确定何时使用锚标记包装文本,则可以使用RegularExpressions通过http://msdn.microsoft.com/en-us/library/sdx2bds0.aspx
确定您的输入是否匹配可以做一些像
这样简单的事情private string Pattern = "whateverregexpatternyouhavewritten";
private bool MatchesPattern(string input)
{
return Regex.IsMatch(Pattern, input);
}