2010-01-19 3 views
2

나는 asp.net/C#를 사용하고 있으며 나는 만들고있는 작은 CMS 시스템에 대해 고유 한 (?) uris를 만들려고합니다.SEO 클린 우리에서 스트립 아웃 문자

제목이 "내 놀라운 기사"인 경우 예를 들어, URI가 있습니다

www.website.com/news/my-amazing-article 것, 그래서 내가, 내 기사 제목에서 URI 세그먼트를 생성하고 이 두 부분. 첫째, 어떤 캐릭터를 스트립해야한다고 생각하니? 나는 "-"로 공백을 대체 할 것이고 "/"문자도 제거해야한다고 생각합니다. 더 이상 문제를 일으킬 수 있다고 생각할 수 있습니까? "?" 혹시? 알파가 아닌 모든 문자를 제거해야합니까?

위의 두 번째 질문에 위의 uris는 고유해야 할 수도 있습니다. 독창성을 보장하기 위해 추가하기 전에 uri 목록을 확인하려고했지만 스택 오버플로는 숫자와 uri를 사용합니다. 이것은 내가 제목이 복제 될 수 있다고 가정합니까? 이것이 더 좋은 방법이라고 생각합니까?

답변

9

모든 분음 기호를 기본 문자로 변환 한 다음 Char.IsLetterOrDigit을 사용하여 문자 또는 숫자가 아닌 문자를 제거합니다.

그런 다음 모든 공백을 대시 하나로 바꿉니다.

이것은 우리 소프트웨어에서 사용하는 것입니다.

/// <summary> 
/// Convert a name into a string that can be appended to a Uri. 
/// </summary> 
private static string EscapeName(string name) 
{ 
    if (!string.IsNullOrEmpty(name)) 
    { 
     name = NormalizeString(name); 

     // Replaces all non-alphanumeric character by a space 
     StringBuilder builder = new StringBuilder(); 
     for (int i = 0; i < name.Length; i++) 
     { 
      builder.Append(char.IsLetterOrDigit(name[i]) ? name[i] : ' '); 
     } 

     name = builder.ToString(); 

     // Replace multiple spaces into a single dash 
     name = Regex.Replace(name, @"[ ]{1,}", @"-", RegexOptions.None); 
    } 

    return name; 
} 

/// <summary> 
/// Strips the value from any non english character by replacing thoses with their english equivalent. 
/// </summary> 
/// <param name="value">The string to normalize.</param> 
/// <returns>A string where all characters are part of the basic english ANSI encoding.</returns> 
/// <seealso cref="http://stackoverflow.com/questions/249087/how-do-i-remove-diacritics-accents-from-a-string-in-net"/> 
private static string NormalizeString(string value) 
{ 
    string normalizedFormD = value.Normalize(NormalizationForm.FormD); 
    StringBuilder builder = new StringBuilder(); 

    for (int i = 0; i < normalizedFormD.Length; i++) 
    { 
     UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(normalizedFormD[i]); 
     if (uc != UnicodeCategory.NonSpacingMark) 
     { 
      builder.Append(normalizedFormD[i]); 
     } 
    } 

    return builder.ToString().Normalize(NormalizationForm.FormC); 
} 

생성 된 이름을 고유 ID로 사용하는 것에 대해서는 보증합니다. 생성자 이름을 SEO 도우미로 사용하지만 키 확인자는 사용하지 마십시오. stackoverflow가 페이지를 참조하는 방법을 살펴보면 :

http://stackoverflow.com/questions/249087/how-do-i-remove-diacritics-accents-from-a-string-in-net 
            ^--ID ^--Unneeded name but helpful for bookmarks and SEO 

여기에서 ID를 찾을 수 있습니다. 같은 페이지에이 두 URL 포인트 :

http://stackoverflow.com/questions/249087/how-do-i-remove-diacritics-accents-from-a-string-in-net 

http://stackoverflow.com/questions/249087/ 
+0

재미 있고 유용한 코드를 보내 주셔서 감사합니다! 나는 id와 name의 조합을 제안하기도하고 stackoverflow도 구현하기로 결정했습니다. – DanDan

+0

나는이 "가짜"SEO를 좋아하지 않는다. URL의 절반은 의미가 없다. 또한이 페이지는 http://stackoverflow.com/questions/2095957/and-now-for-something-completely-different – DisgruntledGoat

+0

에서 찾을 수 있습니다. 매우 흥미로운 코드입니다. 공유 해 주셔서 감사합니다. –

2

당신은 IETF RFC 3986을 참조 할, URI를 설명하고 어떤 법률 및 법적 없습니다.

유효성 너머에서 읽을 수있는 URI를 원할 수도 있습니다. 이 경우 모든 영숫자가 아닌 문자를 제거하십시오.

stackoverflow에서 제목은 변경할 수 있으므로 URI에 대해 고유하지만 변함없는 구별 자의 ID를 사용합니다. 변경 가능한 제목이 없으면 텍스트 만 사용하면됩니다. 발행 후 제목을 편집 할 수 있다면 id가 더 좋습니다.

+0

링크를 제공해 주셔서 감사합니다. – DanDan

1

질문 1 : Rob Conery는 슬러그 생성을 위해 문자열을 청소하는 데 매우 유용합니다 (Regex-based solution). 여기에 확장 방법이다 (단지 정적 클래스이 추가) : 당신이 그 (것)들을 고유하려는 경우

public static string CreateSlug(this string source) 
{ 
    var regex = new Regex(@"([^a-z0-9\-]?)"); 
    var slug = ""; 

    if (!string.IsNullOrEmpty(source)) 
    { 
     slug = source.Trim().ToLower(); 
     slug = slug.Replace(' ', '-'); 
     slug = slug.Replace("---", "-"); 
     slug = slug.Replace("--", "-"); 
     if (regex != null) 
      slug = regex.Replace(slug, ""); 

     if (slug.Length * 2 < source.Length) 
      return ""; 

     if (slug.Length > 100) 
      slug = slug.Substring(0, 100); 
    } 
    return slug; 
} 

질문이 들어, 그냥 데이터베이스에 컬럼에 UNIQUE 제약을 줄 수 있습니다. 이렇게하면 예외를 잡아두고 유용한 사용자 입력을 제공 할 수 있습니다. 당신이 그것을 좋아하지 않는다면, 게시물 식별자에 의존하는 것이 아마도 좋은 대안 일 것입니다.

+0

또는 예외를 트래핑하는 대신 URI가 발견 된 제목에 대한 쿼리를 수행하고 결과를 얻은 경우 해당 항목에 -1을 추가 한 다음 -2 등을 추가합니다. DB. 물론 예외를 잡아야하지만 이상적으로 DB에 삽입하는 것이 더 똑똑 할 수 있습니다. – Cheeso