我有一个例如文字:
" Visit <a href="http://www.flexstaff.com">www.flexstaff.com</a> for details
Email <a href="mailto:rachel@flexstaff.com">rachel@flexstaff.com</a> apply online."
我想删除仅包含&#34; mailto &#34;的标签。所以
<a href="mailto:rachel@flexstaff.com">rachel@flexstaff.com</a> will become
rachel@flexstaff.com
我有这个正则表达式:
Dim rgxMailTo = New Regex("<a\b\s[^<>]*(?<=@.*)>|(?<=@.*)</a>",RegexOptions.IgnoreCase)
Dim ret As String = rgxMailTo.Replace(text, Environment.NewLine)
但它也会选择其他标签。
答案 0 :(得分:1)
使用以下正则表达式,然后将匹配项替换为$1
。
<a\b\s*[^<>]*\bmailto\b[^<>]*>([^<>]*)<\/a>
仅选择标签。
<a\b\s*[^<>]*\bmailto\b[^<>]*>|(?<=<a\b\s*[^<>]*\bmailto\b[^<>]*>[^<>]*)<\/a>
答案 1 :(得分:0)
如果您的文本来源不确定(因此并非所有文本都以100%可预测的方式生成),使用正则表达式是一个非常糟糕的主意 - 相信我,我一直在那里。
一个选项是使用Html Agility Pack,并将HTML加载为XElement(C#,因为我手边有样本):
HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(HTML);
htmlDoc.OptionOutputAsXml = true;
using (var stream = new MemoryStream())
{
htmlDoc.Save(stream);
stream.Position = 0;
var xelement = XElement.Load(stream);
DoStuffToXElement(xelement);
}
注意,如果你只有一个没有根元素的片段:
<a href="#">Link</a>
<img src="#"/>
请记住将其包裹在中性内容中,例如htmlDoc.LoadHtml("<div>"+HTML+"</div>");
现在您可以使用LinqToXml找到您需要的任何内容,遍历树或安全地做任何事情:
xHtml
.Descendants()
.Where(e=>e.Name.LocalName.Equals("a", StringComparison.OrdinalIgnoreCase)
&& e.Attribute("href") != null
&& e.Attribute("href").Value.StartsWith("mailto:", StringComparison.OrdinalIgnoreCase))
.Remove();
最后注意事项:这几乎总是比正则表达式慢得多 - 如果时间很重要(例如你在每次加载页面时都这么做),它可能太慢了,但我想这种处理可以事先做好吗?
答案 2 :(得分:0)
您可以像这样使用LINQ to XML的强大功能:
Imports System.Text.RegularExpressions
Imports System.Xml.Linq
Imports System.Xml
Imports System.Xml.XPath
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim str As String = "Visit <a href=""http://www.flexstaff.com"">www.flexstaff.com</a> for details\nEmail <a href=""mailto:rachel@flexstaff.com"">rachel@flexstaff.com</a> apply online."
Dim xDoc As XDocument = XDocument.Parse("<?xml version= '1.0'?><root>" + str + "</root>")
Dim query = xDoc.XPathSelectElements("//a[contains(@href,'mailto')]")
For Each element In query
element.Remove()
Next element
Dim Res As String = xDoc.ToString().Replace("<root>", String.Empty).Replace("</root>", String.Empty)
End Sub
End Class
Outoput(Res
):
Visit <a href="http://www.flexstaff.com">www.flexstaff.com</a> for details\nEmail apply online.