Archiwum
java seo friendly url (slug)
Tworząc aplikację internetową, często w adresach pojawia się jakiś tekst, np tytuł wprowadzony przez użytkownika podczas dodawania artykuły, chociażby blogi na wordpressie.
Jednak adres w postaci http://www.ryznar.eu/artykul/śmieszny-artykuł podobno jest gorzej odbierany przez google, dwa w niektórych przeglądarkach jest on niezbyt czytelny bo przeglądarka nie potrafi przetworzyć np.: IE.
Dlatego tekst wprowadzony przez użytkownika należy nieco zmodyfikować. Z racji ze potrzebuję takiej funkcji napisałem sobie odpowiednią klasę:
import java.text.Normalizer; import java.text.Normalizer.Form; public class Slug { public static String parse(String input) { if (isEmptyOrNull(input)) { return ""; } String out = normalize(input); out = removeDuplicateWhiteSpaces(out); out = out.toLowerCase(); out = out.replace(" ", "-"); return out; } private static String normalize(String input) { String result = Normalizer.normalize(input, Form.NFD).replaceAll("[^\\p{ASCII}]", ""); // 1 result = result.replaceAll("[^a-zA-Z0-9\\s]", " "); // 2 return result; } private static String removeDuplicateWhiteSpaces(String input) { return input.replaceAll("\\s+", " "); } private static boolean isEmptyOrNull(String input) { return (input == null || input.trim().length() == 0); } }
1) tekst jest normalizowany, tzn znaki diakrytyczne są zmieniane na znaki ASCII
2) tutaj zmieniamy wszystkie znaki niealfanumeryczne na spacje
Możemy przetestować klasę:
String inputText = "123-test nąśŹA zima 🙂 !! #@ zła"; System.out.println(inputText); System.out.println(Slug.parse(inputText));
wynik: 123-test-nasza-zima-za – zjadło literkę „l”
okazuje się że na l może być zamieniony l̷ a nie ł
Niestety w sieci nie widzę żadnej wskazówki jak ładnie rozwiązać ten problem, więc na razie pozostaje mi tylko zmodyfikować ciało funkcji normalize:
String result = input.replace("ł", "l").replace("Ł", "L"); result = Normalizer.normalize(result, Form.NFD).replaceAll("[^\\p{ASCII}]", ""); // 1 result = result.replaceAll("[^a-zA-Z0-9\\s]", " "); // 2
jeśli ktoś wie jak to zrobić normalnie a nie poprzez takie kombinacje, będę wdzięczny za komentarz
Najnowsze komentarze