vb.net正则表达式使用mailto删除标签

时间:2015-04-02 07:21:05

标签: regex vb.net

我有一个例如文字:

" 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) 

但它也会选择其他标签。

3 个答案:

答案 0 :(得分:1)

使用以下正则表达式,然后将匹配项替换为$1

<a\b\s*[^<>]*\bmailto\b[^<>]*>([^<>]*)<\/a>

DEMO

仅选择标签。

<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.