3

我有一个 HTMLElementCollection,我正在使用 For Each 循环查看 InnerHTML 是否包含某些单词。如果它们确实包含任何这些关键字,则会将其保存到文件中。

一切正常,但我想知道是否有办法简化。这是一个示例

For Each Helement As HtmlElement In elements

     If Helement.InnerHtml.Contains("keyword1") Or Helement.InnerHtml.Contains("keyword2") Or Helement.InnerHtml.Contains("keyword3") Or Helement.InnerHtml.Contains("keyword4") Or Helement.InnerHtml.Contains("keyword5") = True Then
         ' THE CODE TO COPY TO FILE
     End If

Next Helement

是否存在任何可以工作的东西:

If Helement.InnerHtml.Contains("keyword1", "keyword2", "keyword3", "keyword4", "keyword5")

我现在这样做的方式似乎很浪费,而且我对此非常有强迫症。

4

3 回答 3

3

1)一种方法是将InnerHtml字符串与包含关键字的正则表达式匹配作为替代列表:

Imports System.Text.RegularExpressions

Dim keywords As New Regex("keyword1|keyword2|keyword3")

...

If keywords.IsMatch(HElement.InnerHtml) Then ...

如果您事先知道所有关键字,这应该会很好。

2)另一种方法是构建关键字列表,然后将InnerHtml字符串与列表的每个元素进行比较:

Dim keywords = {"keyword1", "keyword2", "keyword3"}

...

For Each keyword As String In keywords
    If HElement.InnerHtml.Contains(keyword) Then ...
Next

编辑:Rob 建议的扩展方法将产生比上述方法#2,IMO 更优雅的代码。

于 2010-02-06T10:02:12.237 回答
3

您可以将扩展方法写入提供多输入选项的字符串,例如:

 Public Module StringExtensionMethods
     Private Sub New()
     End Sub
     <System.Runtime.CompilerServices.Extension> _
     Public Function Contains(ByVal str As String, ByVal ParamArray values As String()) As Boolean
         For Each value In values
             If str.Contains(value) Then
                 Return True
             End If
         Next
         Return False
     End Function
 End Module

然后你可以改为调用它,就像你的第二个例子一样:)

于 2010-02-06T10:02:36.120 回答
0

这是另一种使用 LINQ 稍微清理逻辑的扩展方法:

<Extension()>
Public Function MultiContains(str As String, ParamArray values() As String) As Boolean
    Return values.Any(Function(val) str.Contains(val))
End Function
于 2015-02-19T13:28:24.463 回答