2015-04-02 79 views
1

我有例如文本:vb.net正则表达式中删除标签与邮寄地址

" Visit <a href="http://www.flexstaff.com">www.flexstaff.com</a> for details 
Email <a href="mailto:[email protected]">[email protected]</a> apply online." 

我想删除包含“的mailto”所以

<a href="mailto:[email protected]">[email protected]</a> will become 
[email protected] 
的一个标签

我有这样的正则表达式:

Dim rgxMailTo = New Regex("<a\b\s[^<>]*(?<[email protected]*)>|(?<[email protected]*)</a>",RegexOptions.IgnoreCase) 
    Dim ret As String = rgxMailTo.Replace(text, Environment.NewLine) 

但它也选择其他标签。

回答

1

使用正则表达式下面,然后用$1更换比赛。

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

DEMO

只选择标签。

<a\b\s*[^<>]*\bmailto\b[^<>]*>|(?<=<a\b\s*[^<>]*\bmailto\b[^<>]*>[^<>]*)<\/a> 
+0

或'] * \ bmailto \ B [^ <>] * @ [^ <>] *>([^ <>] *)<\/a>' – 2015-04-02 07:29:44

+0

不,我不希望它在标签内捕捉到的电子邮件地址,只有一个标签变通它。 它应该只选择: 2015-04-02 07:36:13

+0

你的人问这样'[email protected]将成为 雷切尔@ flexstaff.com' – 2015-04-02 07:44:59

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(); 

最后一点:这几乎总是比正则慢得多 - 如果时间是很重要的(比如你做的每一个页面加载或某物)它可能是太慢了,但我猜这种处理可以预先完成吗?

0

可以使用LINQ的力量来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:[email protected]"">[email protected]</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.