Co to jest dobre kompletne wyrażenie regularne lub inny proces, który mógłby przyjąć tytuł:
Jak zmienić tytuł na część adresu URL, np. Przepełnienie stosu?
i zamień to w
how-do-you-change-a-title-to-be-part-of-the-url-like-stack-overflow
który jest używany w przyjaznych SEO adresach URL w przepełnieniu stosu?
Środowiskiem programistycznym, z którego korzystam, jest Ruby on Rails , ale jeśli istnieją inne rozwiązania specyficzne dla platformy (.NET, PHP, Django ), też chciałbym je zobaczyć.
Jestem pewien, że ja (lub inny czytelnik) napotkam ten sam problem na innej platformie.
Korzystam z niestandardowych tras i chcę przede wszystkim wiedzieć, jak zmienić ciąg znaków, aby wszystkie znaki specjalne zostały usunięte, wszystkie małe litery i wszystkie białe znaki są zastępowane.
regex
language-agnostic
seo
friendly-url
slug
wusher
źródło
źródło
Odpowiedzi:
Oto jak to robimy. Zauważ, że prawdopodobnie jest więcej warunków brzegowych, niż ci się wydaje na pierwszy rzut oka.
Jest to druga wersja, rozwinięta w celu uzyskania 5-krotnie większej wydajności (i tak, przetestowałem ją). Pomyślałem, że zoptymalizuję tę funkcję, ponieważ tę funkcję można wywołać setki razy na stronę.
Aby zobaczyć poprzednią wersję kodu, który został zastąpiony (ale jest funkcjonalnie równoważny i 5 razy szybszy), przejrzyj historię zmian tego postu (kliknij link daty).
Również
RemapInternationalCharToAscii
kod źródłowy metody można znaleźć tutaj .źródło
RemapInternationalCharToAscii()
funkcji jest tam meta.stackexchange.com/questions/7435/…if (prevdash) sb.Length -= 1; return sb.ToString();
zamiast ostatniejif
instrukcji.sb.Length == maxlen break;
jest błędny, jeśli znak na maxLenght-1 to „ß”, zostanie przekonwertowany na „ss”sb.Length == maxlene
, nigdy nie będzie prawdą, lepiej zamiast tego sprawdzić(sb.Length > = maxlen)
.Oto moja wersja kodu Jeffa. Wprowadziłem następujące zmiany:
Konwersja spraw jest teraz również opcjonalna.
Aby uzyskać więcej informacji, testy jednostkowe i wyjaśnienie dlaczego Facebook „s URL schemat jest trochę mądrzejszy niż Stos przepełnienie, Mam rozszerzoną wersję to na moim blogu .
źródło
if (i == maxlen) break;
naif (sb.Length == maxlen) break;
zamiast, aby po przekazaniu ciągu z dużą ilością białych / niepoprawnych znaków nadal można było uzyskać żądaną długość, podczas gdy kod w obecnej postaci może skończyć masowo go obcinając (np. rozważ przypadek, w którym zaczynasz z 80 spacjami ...). A przybliżony test 10 000 000 iteracji w stosunku do kodu Jeffa pokazał, że jest to mniej więcej ta sama prędkość.Będziesz chciał ustawić niestandardową trasę, aby adres URL wskazywał kontroler, który ją obsłuży. Ponieważ używasz Ruby on Rails, oto wprowadzenie do korzystania z ich silnika routingu.
W Ruby potrzebujesz wyrażenia regularnego, takiego jak już znasz, a oto wyrażenie regularne do użycia:
źródło
Możesz także użyć tej funkcji JavaScript do generowania ślimaka w formie (ta jest oparta na / skopiowana z Django ):
źródło
Na wszelki wypadek, oto funkcja PHP w WordPress, która to robi ... Myślę, że WordPress jest jedną z bardziej popularnych platform, która wykorzystuje fantazyjne linki.
Ta funkcja, a także niektóre funkcje pomocnicze można znaleźć w wp-include / formatting.php.
źródło
remove_accents
,seems_utf8
...git clone git://core.git.wordpress.org/
znaleźć i znaleźćwp-includes/formatting.php
plikJeśli używasz krawędzi Railsów, możesz polegać na Inflector.parametrize - oto przykład z dokumentacji:
Również jeśli potrzebujesz obsługiwać bardziej egzotyczne znaki, takie jak akcenty (éphémère) w poprzedniej wersji Railsów, możesz użyć kombinacji PermalinkFu i DiacriticsFu :
źródło
Nie znam Ruby on Rails, ale poniżej znajduje się (nieprzetestowany) kod PHP. Prawdopodobnie możesz to bardzo szybko przetłumaczyć na Ruby on Rails, jeśli uznasz to za przydatne.
Mam nadzieję, że to pomoże.
źródło
Nie mam wiele na temat Ruby ani Railsów, ale w Perlu tak postąpiłbym:
Właśnie zrobiłem szybki test i wydaje się, że działa. Mam nadzieję, że jest to stosunkowo łatwe do przetłumaczenia na Ruby.
źródło
Implementacja T-SQL, zaadaptowana z dbo.UrlEncode :
źródło
Wiem, że to bardzo stare pytanie, ale ponieważ większość przeglądarek obsługuje teraz adresy Unicode , znalazłem świetne rozwiązanie w XRegex, które konwertuje wszystko oprócz liter (we wszystkich językach na „-”).
Można to zrobić w kilku językach programowania.
Wzór jest,
\\p{^L}+
a następnie wystarczy go użyć, aby zastąpić wszystkie nieliterowe litery na „-”.Przykład działania w node.js z modułem xregex .
źródło
Zakładając, że twoja klasa modelu ma atrybut title, możesz po prostu przesłonić metodę to_param w modelu, w następujący sposób:
Ten odcinek Railscast zawiera wszystkie szczegóły. Możesz również upewnić się, że tytuł zawiera tylko prawidłowe znaki, używając tego:
źródło
Kod Briana w języku Ruby:
downcase
Okazuje się ciąg małych liter,strip
usuwa początkowe i końcowe białe znaki, pierwszegsub
wezwanie g lobally sub instytutów przestrzenie z kreskami, a drugi usuwa wszystko, co nie jest literą lub myślnik.źródło
Jest mała wtyczka Ruby on Rails o nazwie PermalinkFu , która to robi. Metoda ucieczki robi przekształcenia na ciąg znaków, który jest odpowiedni dla adresu URL . Spójrz na kod; ta metoda jest dość prosta.
Aby usunąć znaki spoza ASCII , używa iconv lib do tłumaczenia na „ascii // ignore // translit” z „utf-8”. Spacje są następnie przekształcane w myślniki, wszystko jest pisane małymi literami itp.
źródło
Możesz użyć następującej metody pomocnika. Może konwertować znaki Unicode.
źródło
Oto moja (wolniejsza, ale przyjemniejsza do napisania) wersja kodu Jeffa:
Mój ciąg testowy:
" I love C#, F#, C++, and... Crème brûlée!!! They see me codin'... they hatin'... tryin' to catch me codin' dirty... "
źródło
Rozwiązanie Stackoverflow jest świetne, ale nowoczesna przeglądarka (z wyjątkiem IE, jak zwykle) teraz obsługuje ładnie kodowanie utf8:
Zaktualizowałem więc proponowane rozwiązanie:
Pełny kod na Pastebin
Edycja: Oto kod dla
RemapInternationalCharToAscii
metody (to brakuje w pastebin).źródło
Podobał mi się sposób, w jaki odbywa się to bez użycia wyrażeń regularnych , więc przeniosłem go na PHP. Właśnie dodałem funkcję wywoływaną
is_between
do sprawdzania znaków:źródło
Teraz wszystkie przeglądarki ładnie obsługują kodowanie utf8, dzięki czemu można używać metody WebUtility.UrlEncode , podobnie jak HttpUtility.UrlEncode używanej przez @giamin, ale działa ona poza aplikacją internetową.
źródło
Przeniesiłem kod do TypeScript. Można go łatwo dostosować do JavaScript.
Dodaję
.contains
metodę doString
prototypu, jeśli celujesz w najnowsze przeglądarki lub ES6, możesz.includes
zamiast tego użyć .źródło
Nie nie nie. Wszyscy bardzo się mylicie. Z wyjątkiem rzeczy diacritics-fu, dostaniesz się tam, ale co z postaciami azjatyckimi (szkoda twórców Ruby za to, że nie brali pod uwagę swoich braci nihonjin ).
Zarówno Firefox, jak i Safari wyświetlają w adresie URL znaki spoza ASCII i szczerze mówiąc, wyglądają świetnie. Miło jest wspierać linki takie jak „ http://somewhere.com/news/read/ お 前 た ち は ア ホ じ ゃ な い か い ”.
Oto kod PHP, który to zrobi, ale właśnie go napisałem i nie przetestowałem go.
Przykład:
Wyjścia: コ リ ン -and- ト ー マ ス -and- ア ー ノ ル ド
„-And-” jest spowodowane tym, że & zmieniono na „-and-”.
źródło