URL, дружественные к Java и SEO: © reate valid действительный URL-адрес http из строки, составленной специальными символами - PullRequest
6 голосов
/ 23 июня 2010

Я пытаюсь извлечь оптимизированные для SEO URL-адреса из строк, которые могут содержать специальные символы, буквы с акцентами, символы, похожие на китайский, и т. Д.
ТАК делает это и переводит заголовок этого сообщения в

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

Я пытаюсь сделать это на Java.
Я использую это сообщение решение с URLEncoder.encode для перевода китайских и других символов в действительные символы URL.

Вы когда-нибудь реализовывали что-то подобное?Есть ли лучший способ?

Ответы [ 3 ]

2 голосов
/ 24 июня 2010

Это может быть слишком упрощенным подходом к проблеме, но вы можете просто использовать регулярные выражения для удаления всех нестандартных символов.Поэтому после преобразования строки в нижний регистр вы можете заменить все нестрочные буквенные символы пустым символом, а затем заменить все пробелы символом «-».

private static String encodeForUrl(String input) {
  return input.toLowerCase().replaceAll("[^a-z\\s]", "").replaceAll("\\s", "-");
}
1 голос
/ 24 июня 2010

Я не знаю ни одного стандартного способа для этого, я использовал решение 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 голосов
/ 24 июня 2010

Я бы сказал, что URLEncoder.encode - это путь.Все не-URL-символы сопоставлены, и вы, конечно, не хотите заново изобретать колесо (снова, снова и снова).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...