我有一个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")
我现在这样做的方式似乎很浪费,而且我对此非常感兴趣。
答案 0 :(得分:3)
您可以将Extension Method写入提供多输入选项的字符串,例如:
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
然后你可以调用它,就像在你的第二个例子中那样:)
答案 1 :(得分:2)
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更优雅的代码。
答案 2 :(得分: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