Eu quero ter uma função para criar lesmas a partir de seqüências de caracteres Unicode, por exemplo, gen_slug('Andrés Cortez')
deve retornar andres-cortez
. Como devo fazer isso?
php
internationalization
slug
Andres SK
fonte
fonte
andres
. Tem certeza de que sua entrada é exatamente "andrés"?Respostas:
Em vez de uma substituição longa, tente este:
Isso foi baseado no tutorial Jobeet do Symfony.
fonte
^
logo após o suporte de abertura - ele reverte a partida.iconv
não será convertido corretamente se$text
contiver caracteres que não tenham equivalente ascii. Por exemploiconv('utf-8', 'us-ascii//TRANSLIT', "EFI收购Cretaprint")
, retornará"EFI"
e vazará um aviso.$text = trim($text, '-');
deve estar no final, caso contrário,Foo 收
torna-sefoo-
. Além disso,Foo 收 Bar
torna-sefoo--bar
(o repetido-
parece redundante).Atualizar
Como esta resposta está recebendo alguma atenção, estou adicionando algumas explicações.
A solução fornecida substituirá essencialmente tudo, exceto AZ, az, 0-9, & - (hífen) por - (hífen). Portanto, ele não funcionará corretamente com outros caracteres unicode (que são caracteres válidos para uma slug / string de URL). Um cenário comum é quando a sequência de entrada contém caracteres que não estão em inglês.
Use esta solução apenas se tiver certeza de que a sequência de entrada não terá caracteres unicode, que você pode querer fazer parte da saída / lesma.
Por exemplo. "नारी शक्ति" se tornará "----------" (todos os hífens) em vez de "नारी-शक्ति" (slug de URL válido).
Resposta original
E se...
?
fonte
strtolower(trim(preg_replace('/[^A-Za-z0-9-]+/', '-', "Étienne")))
retorna em"-tienne"
vez de"etienne"
, portanto, não funciona com caracteres acentuados.Se você possui a extensão intl instalada, pode usar a função Transliterator :: transliterate para criar uma lesma facilmente.
fonte
Nota: Eu tirei isso do wordpress e funciona !!
Use-o assim:
Código
fonte
sanitize_title_with_dashes($string, null, 'save')
(observe os parâmetros extras), caso contrário, você obtém alguns códigos de caracteres confusos comotelstra%e2%80%99s-%e2%80%98all-roles-flex%e2%80%99
. Não é muito bonita. :-(sanitize
é um nome de função estranho e esquecível para gerar uma lesma.É sempre uma boa ideia usar soluções existentes que são suportadas por muitos desenvolvedores de alto nível. O mais popular é https://github.com/cocur/slugify . Primeiro de tudo, ele suporta mais de um idioma e está sendo atualizado.
Se você não quiser usar o pacote inteiro, poderá copiar a parte necessária.
fonte
Aqui está outro, por exemplo "Título com caracteres estranhos ééé AX Z" se torna "título com caracteres estranhos eee-axz".
fonte
Uma versão atualizada do código @Imran Omar Bukhsh (da última ramificação do Wordpress (4.0)):
Veja o exemplo online .
fonte
%c2%abgq%c2%bb-elyas-mbarek-geh%c3%b6rt-zu-m%c3%a4nnern-des-jahres
fonte
Não use preg_replace para isso. Existe uma função php criada apenas para a tarefa: strtr () http://php.net/manual/en/function.strtr.php
Retirado dos comentários no link acima (e eu mesmo testei; funciona:
fonte
Estou usando:
O único substituto é que os caracteres cirílicos não serão convertidos, e agora estou procurando uma solução que não seja longa str_replace para cada caracter cirílico.
fonte
set_locale('cyrillic.UTF-8')
primeiro. O valor exato depende dos locais instalados.Eu não sabia qual usar, então fiz um banco rápido no phptester.net
Início:
Resultados de saída:
São necessários mais testes.
Edit: menos teste de iterações
Início:
Resultados de saída:
fonte
Você pode dar uma olhada
Normalizer::normalize()
, veja aqui . Ele só precisa carregar o módulo intl para PHPfonte
Que tal usar algo que já está implementado no Core?
Ou um dos principais métodos de reescrita de URL / URL.
fonte
Como os gTLDs e IDNs estão se tornando cada vez mais utilizados, não vejo por que o URL não deve conter Andrés.
Basta criar o código $ URL que você deseja. A maioria dos navegadores mostra caracteres UTF-8 em URLs (talvez não seja o IE6 antigo) e bit.ly / goo.gl pode ser usado para abreviá-lo em casos como russo e árabe, se necessário, para fins de anúncio ou apenas escrevê-los em anúncios. como o usuário os escreveria no URL do navegador.
A única diferença é que os espaços "" podem ser uma boa ideia substituí-los por "-" e "/" se você não quiser permitir.
URL como codificado http://www.hurtta.com/RU/%D0%9F%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%8B/
URL conforme escrito http://www.hurtta.com/RU/Продукты/
fonte
Eu escrevi isso com base na resposta de Maerlyn. Esta função funcionará independentemente da codificação de caracteres na página. Também não transforma aspas simples em traços :)
fonte
no meu localhost tudo estava ok, mas no servidor ele me ajudou "set_locale" e "utf-8" em "mb_strtolower".
fonte
A maneira mais elegante que eu acho é usar um Behat \ Transliterator \ Transliterator.
Eu preciso estender essa classe por sua classe, porque é um resumo, alguns como este:
E então, basta usá-lo:
Claro que você deve colocar essas coisas no seu compositor também.
Mais informações aqui https://github.com/Behat/Transliterator
fonte
Há uma boa solução aqui que lida com caracteres especiais também.
Texto Fantástico => texto-fantastico
Autor: Natxet
fonte
Esta pode ser uma maneira de fazer isso também. Inspirado a partir desses links Intercâmbio de especialistas e alinalexander
fonte
Desde que eu vi muitos métodos aqui, mas eu encontrei um método mais simples para mim. Talvez isso ajude alguém.
fonte
Para mim, essa variante é perfeita, mas também muda
&
paraand
. Aqui está o código:fonte