构建一致的URL(路由)所需的概念

时间:2010-11-24 17:29:53

标签: asp.net asp.net-mvc regex vb.net

我的项目需要构建类似于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

提前致谢。

2 个答案:

答案 0 :(得分:2)

在正则表达式的末尾添加+ 这将告诉它匹配与+之前的字符类匹配的一个或多个字符。

此外,您应该在方法之外的Regex字段中创建Shared实例,以便每次调用方法时.Net都不需要再次解析正则表达式。

[由rockinthesixstring编辑]:这是最终结果

    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