2010-06-23 2 views
6

특수 문자, 액센트가있는 문자, 중국어 같은 문자 등을 포함 할 수있는 문자열에서 SEO 친화적 URL을 추출하려고합니다.
그래서이 일을하고 내가 자바에서이 작업을 수행하기 위해 노력하고있어자바 및 SEO 친화적 URL : © reate special 특수 문자로 구성된 문자열의 유효한 http URL

java-and-seo-friendly-urls-reate--a-valid-http-url-from-a-string-composed-by-s 

이 게시물 제목을 번역입니다.
나는 URLEncoder.encode와 함께 this post 해결책을 사용하여 중국어 및 기타 기호를 유효한 URL 문자로 번역합니다.

이런 식으로 구현 한 적이 있습니까? 더 좋은 방법이 있습니까?

+0

이 질문은 PHP에서 그것을 할 수있는 정규식 기반의 방법이 있습니다, http://stackoverflow.com/questions/2580581/best-way-to-escape-and-create-a-slug –

답변

1

표준 방법에 대해 잘 모릅니다. 나는 당신이 참조하고있는 것과 같은 similair 솔루션을 사용하고 있습니다. 확실하지 자신의 더 나은, 그래서 여기 당신이 그것을 가지고있는 :

public class TextUtils { 

private static final Pattern DIACRITICS_AND_FRIENDS = 
     Pattern.compile("[\\p{InCombiningDiacriticalMarks}\\p{IsLm}\\p{IsSk}]+"); 

private static final Transliterator TO_LATIN_TRANSLITERATOR = Transliterator.getInstance("Any-Latin"); 

private static final Pattern EEQUIVALENTS = Pattern.compile("[ǝƏ]+"); 
private static final Pattern IEQUIVALENTS = Pattern.compile("[ı]+"); 
private static final Pattern DEQUIVALENTS = Pattern.compile("[Ððđ]+"); 
private static final Pattern OEQUIVALENTS = Pattern.compile("[Øø]+"); 
private static final Pattern LEQUIVALENTS = Pattern.compile("[Ł]+"); 

//all spaces, non-ascii and punctuation characters except _ and - 
private static final Pattern CRAP = Pattern.compile("[\\p{IsSpace}\\P{IsASCII}\\p{IsP}\\+&&[^_]]"); 
private static final Pattern SEPARATORS = Pattern.compile("[\\p{IsSpace}/`-]"); 

private static final Pattern URLFRIENDLY = Pattern.compile("([a-zA-Z0-9_])*"); 
private static final CharsetEncoder ASCII_ENCODER = Charset.forName("ISO-8859-1").newEncoder(); 

/** 
* Returns true when the input test contains only characters from the ASCII set, false otherwise. 
*/ 
public static boolean isPureAscii(String text) { 
    return ASCII_ENCODER.canEncode(text); 
} 

/** 
* Replaces all characters that normalize into two characters with their base symbol (e.g. ü -> u) 
*/ 
public static String replaceCombiningDiacriticalMarks(String text) { 
    return DIACRITICS_AND_FRIENDS.matcher(Normalizer.normalize(text, Normalizer.Form.NFKD)).replaceAll(""); 
} 

/** 
* Turns the input string into a url friendly variant (containing only alphanumeric characters and '-' and '_'). 
* If the input string cannot be converted an IllegalArgumentException is thrown. 
*/ 
public static String urlFriendlyStrict(String unfriendlyString) throws IllegalArgumentException { 
    String friendlyString = 
      urlFriendly(unfriendlyString); 

    //Assert can be removed to improve performance 
    Assert.isTrue(URLFRIENDLY.matcher(friendlyString).matches(), 
      format("Friendly string [%s] based on [%s] is not friendly enough", friendlyString, unfriendlyString)); 
    return friendlyString; 
} 

/** 
* Turns the input string into a url friendly variant (containing only alphanumeric characters and '-' and '_'). 
* Use {@link #urlFriendlyStrict(String)} to avoid potential bugs in this code. 
*/ 
private static String urlFriendly(String unfriendlyString) { 
    return removeCrappyCharacters(
      replaceEquivalentsOfSymbols(
        replaceCombiningDiacriticalMarks(
          transLiterateSymbols(
            replaceSeparatorsWithUnderscores(
              unfriendlyString.trim()))))).toLowerCase(); 
} 

private static String transLiterateSymbols(String incomprehensibleString) { 
    String latin = TO_LATIN_TRANSLITERATOR.transform(incomprehensibleString); 
    return latin; 
} 

private static String replaceEquivalentsOfSymbols(String unfriendlyString) { 
    return 
      LEQUIVALENTS.matcher(
        OEQUIVALENTS.matcher(
          DEQUIVALENTS.matcher(
            IEQUIVALENTS.matcher(
              EEQUIVALENTS.matcher(unfriendlyString).replaceAll("e")) 
              .replaceAll("i")) 
            .replaceAll("d")) 
          .replaceAll("o")) 
        .replaceAll("l"); 
} 

private static String removeCrappyCharacters(String unfriendlyString) { 
    return CRAP.matcher(unfriendlyString).replaceAll(""); 
} 

private static String replaceSeparatorsWithUnderscores(String unfriendlyString) { 
    return SEPARATORS.matcher(unfriendlyString).replaceAll("_"); 
} 

}

0

내가 URLEncoder.encode 갈 방법입니다 말할 것입니다. URL이 아닌 모든 문자가 매핑되므로 바퀴를 다시 만들지 않으실 것입니다.

+0

예를하지만, 인코딩 문자는 유효한 URL을 얻기위한 마지막 단계 (문자열 악센트 등을 청소 한 후)입니다. 인코딩 된 문자는 검색 엔진 최적화 (SEO)에 적합하지 않습니다 ... 검색에서 잘 수행되지 않습니다. – mickthompson

2

이 문제는 지나치게 단순한 방식 일 수 있지만 정규식을 사용하여 모든 비표준 문자를 제거 할 수 있습니다. 따라서 문자열을 소문자로 변환 한 후에는 소문자가 아닌 모든 영문자를 빈 문자로 바꾸고 모든 공백을 '-'문자로 바꿀 수 있습니다.

private static String encodeForUrl(String input) { 
    return input.toLowerCase().replaceAll("[^a-z\\s]", "").replaceAll("\\s", "-"); 
}