我的项目需要构建类似于stackoverflow上的一致url。我知道如何通过多个过滤器运行字符串来“干掉”,但我想知道是否可以使用单一方法完成所有操作。
基本上我想删除所有特殊字符,并用破折号替换它们但是如果连续有多个破折号,我需要它们是一个破折号。我怎样才能尽可能清洁它?
示例:如果我使用以下字符串。
我的#1活动
我的正则表达式会创建以下字符串
我的 - 1-事件
注意有两个破折号(一个用于空格,一个用于“#”符号)。我需要的是
我-1-事件
以下是我目前正在实施的方式
''# <System.Runtime.CompilerServices.Extension()>
Public Function ToUrlFriendlyString(ByVal input As String) As String
Dim reg As New Regex("[^A-Za-z0-9]")
''# I could run a loop filter here to match "--" and replace it with "-"
''# but that seems like more overhead than necessary.
Return (reg.Replace(Trim(input), "-"))
End Function
然后我所做的就是调用扩展方法
Dim UrlFriendlyString = MyTile.ToUrlFriendlyString
提前致谢。
答案 0 :(得分:2)
在正则表达式的末尾添加+
这将告诉它匹配与+
之前的字符类匹配的一个或多个字符。
此外,您应该在方法之外的Regex
字段中创建Shared
实例,以便每次调用方法时.Net都不需要再次解析正则表达式。
Private UrlRegex As Regex = New Regex("[^a-z0-9]+", RegexOptions.IgnoreCase)
<System.Runtime.CompilerServices.Extension()>
Public Function ToUrlFriendlyString(ByVal input As String) As String
Return (UrlRegex.Replace(Trim(input), "-"))
End Function
答案 1 :(得分:0)
另一种方法是在不使用正则表达式的情况下执行此操作,并且更容易理解如下:
请原谅我,因为我主要是C#家伙。
''# <System.Runtime.CompilerServices.Extension()>
Public Function ToUrlFriendlyString(ByVal input As String) As String
If [String].IsNullOrEmpty(s) = True Then
Return [String].Empty
End If
Dim builder As New StringBuilder()
Dim slug = input.Trim().ToLowerInvariant()
For Each c As Char in slug
Select Case c
Case ' '
builder.Append("-")
Case '&'
builder.Append("and")
Case Else
If (c >= '0' And c <= '9') OrElse (c >= 'a' And c <= 'z') And c != '-')
builder.Append(c)
End If
End Select
Next
Return builder.ToString()
End Function