Chcę mieć funkcję do tworzenia informacji o błędach z ciągów Unicode, np. gen_slug('Andrés Cortez')
Powinien wrócić andres-cortez
. Jak mam to zrobić?
php
internationalization
slug
Andres SK
źródło
źródło
andres
. Czy na pewno wpisujesz dokładnie „andrés”?Odpowiedzi:
Zamiast długich wymian, wypróbuj ten:
Zostało to oparte na tym z samouczka Symfony Jobeet.
źródło
^
nawias otwierający - odwraca mecz.iconv
nie skonwertuje poprawnie, jeśli$text
zawiera znaki, które nie mają odpowiednika ascii. Na przykładiconv('utf-8', 'us-ascii//TRANSLIT', "EFI收购Cretaprint")
zwróci"EFI"
i wycieknie ostrzeżenie.$text = trim($text, '-');
powinno być na końcu, w przeciwnym razie stanieFoo 收
sięfoo-
. RównieżFoo 收 Bar
staje sięfoo--bar
(powtórzenie-
wydaje się zbędne).Aktualizacja
Ponieważ ta odpowiedź przyciąga uwagę, dodaję wyjaśnienie.
Dostarczone rozwiązanie zasadniczo zamieni wszystko oprócz AZ, az, 0-9 i - (łącznik) na - (łącznik). Więc nie będzie działać poprawnie z innymi znakami Unicode (które są prawidłowymi znakami dla slug / string adresu URL). Typowy scenariusz to sytuacja, w której ciąg wejściowy zawiera znaki inne niż angielskie.
Używaj tego rozwiązania tylko wtedy, gdy masz pewność, że ciąg wejściowy nie będzie zawierał znaków Unicode, które możesz chcieć być częścią output / slug.
Na przykład. „नारी शक्ति” zmieni się w „----------” (wszystkie łączniki) zamiast „नारी-शक्ति” (poprawny fragment adresu URL).
Oryginalna odpowiedź
Co powiesz na...
?
źródło
strtolower(trim(preg_replace('/[^A-Za-z0-9-]+/', '-', "Étienne")))
zwraca"-tienne"
zamiast"etienne"
, więc nie działa ze znakami akcentowanymi.Jeśli masz zainstalowane rozszerzenie intl , możesz użyć funkcji Transliterator :: transliterate, aby łatwo utworzyć informacje o pracy.
źródło
Uwaga: wziąłem to z wordpress i działa !!
Użyj tego w ten sposób:
Kod
źródło
sanitize_title_with_dashes($string, null, 'save')
(zwróć uwagę na dodatkowe parametry), w przeciwnym razie otrzymasz niechlujne kody znaków, takie jaktelstra%e2%80%99s-%e2%80%98all-roles-flex%e2%80%99
. Niezbyt ładne. :-(sanitize
jest dziwną, zapomnianą nazwą funkcji do generowania informacji.Zawsze dobrze jest korzystać z istniejących rozwiązań, które są wspierane przez wielu programistów wysokiego poziomu. Najpopularniejszy to https://github.com/cocur/slugify . Przede wszystkim obsługuje więcej niż jeden język i jest aktualizowany.
Jeśli nie chcesz używać całego pakietu, możesz skopiować potrzebną część.
źródło
Oto inny, na przykład „Tytuł z dziwnymi znakami ééé AX Z” staje się „tytułem-z-dziwnymi-znakami-eee-axz”.
źródło
Zaktualizowana wersja kodu @Imran Omar Bukhsh (z najnowszej gałęzi Wordpress (4.0)):
Zobacz przykład online .
źródło
%c2%abgq%c2%bb-elyas-mbarek-geh%c3%b6rt-zu-m%c3%a4nnern-des-jahres
źródło
Nie używaj do tego preg_replace. Istnieje funkcja php zbudowana specjalnie dla tego zadania: strtr () http://php.net/manual/en/function.strtr.php
Zaczerpnięte z komentarzy w powyższym linku (i sam to przetestowałem; działa:
źródło
Ja używam:
Jedyną alternatywą jest to, że znaki cyrylicy nie zostaną przekonwertowane i szukam teraz rozwiązania, które nie jest długim str_replace dla każdego pojedynczego znaku cyrylicy.
źródło
set_locale('cyrillic.UTF-8')
pierwszej kolejności. Dokładna wartość zależy od zainstalowanych ustawień regionalnych.Nie wiedziałem, którego użyć, więc zrobiłem szybką ławkę na phptester.net
Początek:
Wyniki wyjściowe:
Potrzebne dalsze testy.
Edycja: mniej iteracji test
Początek:
Wyniki wyjściowe:
źródło
Możesz rzucić okiem
Normalizer::normalize()
, zobacz tutaj . Wystarczy załadować moduł intl dla PHPźródło
A co z użyciem czegoś, co jest już zaimplementowane w Core?
Lub jedną z podstawowych metod przepisywania adresu URL / URL.
źródło
Odkąd gTLD i IDN są coraz częściej używane, nie rozumiem, dlaczego URL nie powinien zawierać Andrés.
Zamiast tego wystarczy wpisać rawurlencode $ URL. Większość przeglądarek wyświetla w adresach URL znaki UTF-8 (może nie jakieś starożytne IE6), a bit.ly / goo.gl można użyć do skrócenia tekstu w przypadkach takich jak rosyjski i arabski, jeśli zajdzie taka potrzeba, może to być do celów reklamowych lub po prostu wpisz je w reklamach tak jakby użytkownik zapisał je pod adresem URL przeglądarki.
Jedyną różnicą są spacje „”, dobrym pomysłem może być zastąpienie ich znakami „-” i „/”, jeśli nie chcesz ich dopuścić.
Adres URL zakodowany http://www.hurtta.com/RU/%D0%9F%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%8B/
Adres URL zgodnie z zapisem http://www.hurtta.com/RU/Продукты/
źródło
Napisałem to na podstawie odpowiedzi Maerlyna. Ta funkcja będzie działać niezależnie od kodowania znaków na stronie. Nie zamienia też pojedynczych cudzysłowów w myślniki :)
źródło
na moim hoście lokalnym wszystko było w porządku, ale na serwerze pomogło mi to "set_locale" i "utf-8" na "mb_strtolower".
źródło
Myślę, że najbardziej elegancki sposób to użycie Behat \ Transliterator \ Transliterator.
Muszę rozszerzyć tę klasę o twoją klasę, ponieważ jest to streszczenie, niektóre w ten sposób:
A potem po prostu użyj:
Oczywiście powinieneś umieścić to również w swoim kompozytorze.
Więcej informacji tutaj https://github.com/Behat/Transliterator
źródło
Jest tutaj dobre rozwiązanie , które radzi sobie również ze znakami specjalnymi.
Texto Fantástico => texto-fantastico
Autor: Natxet
źródło
To też może być sposób na zrobienie tego. Zainspirowany tymi linkami Eksperci-wymiana i alinalexander
źródło
Odkąd widziałem tutaj wiele metod, ale znalazłem dla siebie najprostszą, może to komuś pomoże.
źródło
Jak dla mnie ten wariant jest idealny, też zmień
&
naand
. Oto kod:źródło