Pracuję nad aplikacją w CodeIgniter i próbuję utworzyć pole w formularzu dynamicznie generując slug URL. Chciałbym usunąć znaki interpunkcyjne, zamienić je na małe litery i zastąpić spacje łącznikami. Na przykład Rib Shane stałby się shanes-rib-shack.
Oto, co mam do tej pory. Małe litery były łatwe, ale zamiana wydaje się w ogóle nie działać i nie mam pojęcia, aby usunąć interpunkcję:
$("#Restaurant_Name").keyup(function(){
var Text = $(this).val();
Text = Text.toLowerCase();
Text = Text.replace('/\s/g','-');
$("#Restaurant_Slug").val(Text);
});
javascript
jquery
regex
GSto
źródło
źródło
Odpowiedzi:
Nie mam pojęcia, skąd wzięło się określenie „ślimak”, ale zaczynamy:
Pierwsza zamiana zamieni spacje na łączniki, druga zamiana usunie wszystko, co nie jest alfanumeryczne, podkreślenie ani łącznik.
Jeśli nie chcesz, aby rzeczy takie jak - zamieniały się w takie jak --- to, możesz zamiast tego użyć tego:
Spowoduje to usunięcie łączników (ale nie spacji) przy pierwszym zastąpieniu, a przy drugim zastąpieniu nastąpi kondensacja kolejnych spacji w jeden łącznik.
Więc „jak - to” wychodzi jako „jak to”.
źródło
text.toLowerCase().replace(/ /g,'-').replace(/[-]+/g, '-').replace(/[^\w-]+/g,'');
zamiast opcji 2. Opcja 2 zamieni „th - is” na „this”.i próbuj
oryginał: http://dense13.com/blog/2009/05/03/converting-string-to-slug-javascript/
EDYCJA: rozszerzona o bardziej specyficzne dla języków znaki:
źródło
ü
należy zastąpićue
itd.å
.İĞŞığş
dofrom
zmiennych i konwertować jeIGSigs
do obsługi znaków tureckich.Po pierwsze, wyrażenia regularne nie powinny mieć otaczających cudzysłowów, więc „/ \ s / g” powinno być / \ s / g
Aby zastąpić wszystkie znaki niealfanumeryczne myślnikami, powinno to zadziałać (używając przykładowego kodu):
To powinno załatwić sprawę ...
źródło
Znalazłem dobre i kompletne rozwiązanie dla języka angielskiego
Kilka przykładów użycia:
Podziękowania dla Andrew Stewarta
źródło
Mam nadzieję, że to może uratować komuś dzień ...
źródło
Potrzebowałeś tylko plusa :)
źródło
Spójrz na tę funkcję slug do dezynfekcji adresów URL, opracowaną przez Seana Murphy'ego pod adresem https://gist.github.com/sgmurphy/3095196
źródło
Tworzę wtyczkę do implementacji w większości języków: http://leocaseiro.com.br/jquery-plugin-string-to-slug/
Domyślne użycie:
Jest to bardzo proste dzięki wtyczce stringToSlug jQuery
źródło
*oparte na https://gist.github.com/mathewbyrne/1280286
teraz możesz przekształcić ten ciąg:
w:
zastosowanie do twojego kodu:
źródło
Połączenie różnych elementów z odpowiedzi tutaj z normalizacją zapewnia dobre pokrycie. Zachowaj kolejność operacji, aby stopniowo czyścić adres URL.
normlize('NFD')
rozbija znaki akcentowane na ich komponenty, które są podstawowymi literami i znakami diakrytycznymi (część akcentowana).replace(/[\u0300-\u036f]/g, "")
usuwa wszystkie znaki diakrytyczne, pozostawiając same podstawowe litery. Resztę wyjaśniają komentarze w tekście.źródło
Możesz użyć do tego własnej funkcji.
spróbuj: http://jsfiddle.net/xstLr7aj/
źródło
Zaakceptowana odpowiedź nie spełniła moich potrzeb (pozwala na podkreślenie, nie obsługuje myślników na początku i na końcu itp.), A inne odpowiedzi miały inne problemy, które nie pasowały do mojego przypadku użycia, więc oto funkcja slugify Wymyśliłem:
To zamieni 'foo !!! BAR _-_-_ baz-' (zwróć uwagę na spację na początku) w
foo-bar-baz
.źródło
Możesz rzucić okiem na wtyczkę speakURL i po prostu:
źródło
Jeszcze jeden. Krótki i zachowuje znaki specjalne:
imaginação é mato => imaginacao-e-mato
źródło
Bardziej wydajna metoda generowania informacji o pracy w czystym JavaScript. W zasadzie obsługuje transliterację wszystkich znaków cyrylicy i wielu umlautów (niemiecki, duński, francuski, turecki, ukraiński itp.), Ale można go łatwo rozszerzyć.
źródło
Dla osób już korzystających
lodash
Większość z tych przykładów jest naprawdę dobra i obejmuje wiele przypadków. Ale jeśli `` wiesz '', że masz tylko angielski tekst, oto moja wersja, która jest bardzo łatwa do odczytania :)
_.words(_.toLower(text)).join('-')
źródło
Cóż, po przeczytaniu odpowiedzi wymyśliłem ten.
źródło
Uwaga: jeśli nie obchodzi Cię argument przeciwko zaakceptowanej odpowiedzi i po prostu szukasz odpowiedzi, pomiń następną sekcję, na końcu znajdziesz moją propozycję odpowiedzi
zaakceptowana odpowiedź ma kilka problemów (moim zdaniem):
1) jak w przypadku pierwszego fragmentu funkcji:
bez względu na wiele następujących po sobie białych znaków
Wejście:
is it a good slug
Odebrane:
---is---it---a---good---slug---
spodziewany:
is-it-a-good-slug
bez względu na wiele kolejnych myślników
Wejście:
-----is-----it-----a-----good-----slug-----
Odebrane:
-----is-----it-----a-----good-----slug-----
spodziewany:
is-it-a-good-slug
proszę zauważyć, że ta implementacja nie obsługuje zewnętrznych myślników (lub białych znaków w tym przypadku), niezależnie od tego, czy są to wiele następujących po sobie znaków, czy pojedyncze znaki, które (o ile rozumiem informacje o ślimakach i ich użycie) są nieprawidłowe
2) jak w przypadku drugiego fragmentu funkcji:
dba o wiele kolejnych białych znaków, konwertując je na pojedyncze,
-
ale to nie wystarczy, ponieważ zewnętrzne (na początku i na końcu ciągu) białe spacje są obsługiwane tak samo, więcis it a good slug
zwróci-is-it-a-good-slug-
usuwa również całkowicie myślniki z wejścia, które konwertuje coś podobnego
--is--it--a--good--slug--'
doisitagoodslug
, fragment komentarza @ ryan-allen zajmuje się tym, pozostawiając problem z zewnętrznymi myślnikami nierozwiązanyteraz wiem, że nie ma standardowej definicji dla ślimaków, a zaakceptowana odpowiedź może załatwić zadanie (którego szukał użytkownik, który zamieścił pytanie), ale jest to najpopularniejsze pytanie SO dotyczące ślimaków w JS, więc te problemy trzeba było wskazać, również (jeśli chodzi o wykonanie pracy! ) Wyobraź sobie wpisywanie tego ohydnego adresu URL (
www.blog.com/posts/-----how-----to-----slugify-----a-----string-----
) lub nawet przekierowanie do niego zamiast czegoś takiego jak (www.blog.com/posts/how-to-slugify-a-string
), wiem, że to skrajny przypadek, ale hej, to właśnie testy są dla.moim zdaniem lepszym rozwiązaniem byłoby:
teraz prawdopodobnie istnieje ninja RegExp, który może przekształcić to w jedno-liniowe wyrażenie, nie jestem ekspertem w RegExp i nie mówię, że jest to najlepsze lub najbardziej kompaktowe rozwiązanie lub takie o najlepszej wydajności ale miejmy nadzieję, że uda się to wykonać.
źródło
Ten kod działa
źródło
To pomogło mi z tym samym problemem!
źródło
to działa dla mnie dobrze.
Znalazłem go w CodeSnipper
źródło
źródło