it-gundan.com

친숙한 URL을 만들 때 잘못된 문자를 어떻게 제거합니까 (예 : 슬러그를 어떻게 작성합니까)?

이 웹 페이지가 있다고 가정합니다 : http://ww.xyz.com/Product.aspx?CategoryId=1

CategoryId = 1의 이름이 "Dogs"인 경우 URL을 다음과 같이 변환하고 싶습니다. http://ww.xyz.com/Products/Dogs

문제는 카테고리 이름에 외국 문자가 있거나 URL에 유효하지 않은 경우입니다. CategoryId = 2의 이름이 "Göra äldre"인 경우 새 URL은 무엇입니까?

논리적으로 http://ww.xyz.com/Products/Göra äldre이어야하지만 작동하지 않습니다.

먼저 공백 때문에 (예를 들어 대시로 쉽게 바꿀 수 있음) 외국 문자는 어떻습니까? Asp.net에서는 다음과 같은 URLEncode 함수를 사용할 수 있습니다. http://ww.xyz.com/Products/G%c3%b6ra+%c3%a4ldre하지만 원래 URL (http://ww.xyz.com/Product.aspx?CategoryId=2)보다 낫다고 말할 수는 없습니다.

이상적으로 이것을 생성하고 싶지만 어떻게 자동으로 수행 할 수 있습니까 (예 : 외국 문자를 '안전한'URL 문자로 변환) : http://ww.xyz.com/Products/Gora-aldre.

6
Anthony

나는 다음 두 가지 확장 방법 (asp.net/C #)을 생각해 냈습니다.

public static string RemoveAccent(this string txt)
{
    byte[] bytes = System.Text.Encoding.GetEncoding("Cyrillic").GetBytes(txt);
    return System.Text.Encoding.ASCII.GetString(bytes);
}

public static string Slugify(this string phrase)
{
    string str = phrase.RemoveAccent().ToLower();
    str = System.Text.RegularExpressions.Regex.Replace(str, @"[^a-z0-9\s-]", ""); // Remove all non valid chars          
    str = System.Text.RegularExpressions.Regex.Replace(str, @"\s+", " ").Trim(); // convert multiple spaces into one space  
    str = System.Text.RegularExpressions.Regex.Replace(str, @"\s", "-"); // //Replace spaces by dashes
    return str;
}
3
Anthony

사용하는 언어와 사용하려는 기술에 따라 다릅니다. Django 소스에서이 JavaScript 스 니펫을 살펴보십시오. 정확히 필요한 것을 수행합니다. 내가 생각하는 언어로 쉽게 이식 할 수 있습니다.

이것은 Python slugify 함수에 사용 된 Django 스 니펫입니다. 훨씬 짧습니다.

def slugify(value):
    """
    Normalizes string, converts to lowercase, removes non-alpha characters,
    and converts spaces to hyphens.
    """
    import unicodedata
    value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore')
    value = unicode(re.sub('[^\w\s-]', '', value).strip().lower())
    return re.sub('[-\s]+', '-', value)

일반적인 문제이기 때문에 모든 언어에 포트가 있다고 생각합니다. 슬러그 파이 + 언어로 Google을 사용하십시오.

2
D4V360

제품 테이블에 각 제품의 URL 안전하고 고유 한 이름이 포함 된 새 필드를 추가 할 수 있습니다. 이것은 처음에 자동으로 생성 될 수 있으며 (가장 안전한 안전 문자-gora-aldre?로 안전하지 않은 문자로 대체) 필요에 따라 미세 조정될 수 있습니다.

안전하지 않은 문자의 대체는 (항상) 뒤집을 수 없기 때문에 이런 종류의 작업을 즉시 수행하는 것은 불가능합니다.

또는 다음과 같이 URL을 작성하십시오.

http://example.com/products/1234/safe-string

여기서 safe-string은 안전하지 않은 문자를 대신하여 즉시 생성됩니다. 1234 번호는 제품 키입니다. 키를 사용하여 제품을 검색하면 '안전 문자열'이 사용자 및 검색 엔진에 더 있습니다.

1
Kris

명심해야 할 두 가지 :

  1. URL 재 작성은 일반적으로 검색 엔진에 긍정적 인 영향을 미치지 않으며, 종종 부정적인 영향을 미치므로 사용자 만족도에 긍정적 인 영향을 미친다는 것을 알고 있어야합니다 (따라서 사용자에게 유용한 URL을 만드십시오). .

  2. URL 재 작성을하기로 결정했다면, 기술 세부 사항을 완벽하게 정리해야합니다. 예를 들어, 동일한 콘텐츠를 나타내는 고유 URL이 둘 이상 있으면 안됩니다. 비 ASCII 컨텐츠 인코딩에 UTF-8을 사용하고 컨텐츠 내에 이스케이프 된 링크를 사용하며 일반적으로 다양한 브라우저에서 테스트하여 작업이 계획대로 작동하는지 확인하십시오. 이 중 하나라도 당신에게 이질적인 것이라면, 당분간 URL 재 작성을하지 않는 것이 좋습니다.

FWIW 일부 검색 엔진 관련 문제는 http://googlewebmastercentral.blogspot.com/2008/09/dynamic-urls-vs-static-urls.html 에서 다룹니다.

1
John Mueller

가장 좋은 방법은 잘못된 문자를 찾으려고하지 않고 whitelist 문자입니다. 그러나 é와 같은 악센트 부호가있는 문자는 상당히 일반적이므로 (그리고 URL이 없으면 URL이 이상합니다) 먼저 변환 할 수 있습니다.

PHP에서 strtr 기능을 사용할 수 있지만 asp.net에서 필요에 따라이 기능을 수정할 수 있어야합니다.

strtr(
  'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿŔŕ',
  'aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyybyrr'
);

이제 프로세스는 다음과 같습니다.

  1. [선택 사항] 문자열을 소문자로 변환합니다 (일반적으로 URL에 권장 됨).
  2. [선택 사항] 위의 매핑을 사용하여 악센트 문자를 변환하십시오.
  3. 입력 문자열을 문자별로 실행하십시오.
  4. 내장 함수에 따라 전체 문자열 대신 문자 당 # 1 및 # 2를 수행하는 것이 더 빠를 수 있습니다.
  5. 문자가 a-z 또는 -9 범위에 있으면 새 문자열에 추가하십시오.
    a) 새 문자열 끝에 하이픈이 이미 있으면 무시하십시오.
    b) 그렇지 않으면 문자열 끝에 하이픈을 추가하십시오.
  6. 마지막에 도달하면 하이픈을 제거하고 앞뒤로 연결하면 끝납니다!
1
DisgruntledGoat

게시물에 ASP.Net : 이 사이트를보십시오 태그가 붙어 있기 때문에 (대부분의) 텍스트를 분음 부호 (잘못된 문자)로 바꾸고 기본 문자로 바꾸는 샘플 코드가 들어 있습니다.

Kris가 언급했듯이이 사이트처럼 URL에 고유 ID를 사용하십시오. 제공된 ID를 제어 할 수없는 경우 외부 고유 ID와 함께 고유 ID가 포함 된 변환 표를 작성해야합니다. 그렇게하면 외부 ID가 변경 될 때 내부 참조도 좋습니다. 고유 한 ID와 함께 고유하지는 않지만 좋아 보이는 "검색 및 인간 최적화 ID"를 저장합니다.

0
GvS

Wikipedia는 종종 URL에서 비 라틴 1 문자를 사용합니다. 이러한 URL을 사용해서는 안되는 이유는 (웹 서버를 지원하지 않는 것 외에)입니다.

하나; 이 문자들을 피해야한다면, 비 - 분음 부호 형식으로 바꾸는 것을 발견했습니다. 이 글을 읽는 대부분의 사람들은 분음 부호가 제거 되었음에도 불구하고 말씀이 무엇인지 알 수 있습니다.

0
Greg B