O que é uma boa expressão regular completa ou algum outro processo que levaria o título:
Como você altera um título para fazer parte do URL, como Stack Overflow?
e transformá-lo em
how-do-you-change-a-title-to-be-part-of-the-url-like-stack-overflow
usado nos URLs compatíveis com SEO no Stack Overflow?
O ambiente de desenvolvimento que estou usando é o Ruby on Rails , mas se houver outras soluções específicas da plataforma (.NET, PHP, Django ), eu adoraria vê-las também.
Tenho certeza de que eu (ou outro leitor) encontrará o mesmo problema em uma plataforma diferente.
Estou usando rotas personalizadas e quero saber principalmente como alterar a string para que todos os caracteres especiais sejam removidos, tudo em minúsculas e todo o espaço em branco seja substituído.
regex
language-agnostic
seo
friendly-url
slug
limpador
fonte
fonte
Respostas:
Aqui está como fazemos. Observe que provavelmente existem mais condições de borda do que você imagina à primeira vista.
Esta é a segunda versão, desenrolada para 5x mais desempenho (e sim, eu a comparei). Achei que seria otimizado porque essa função pode ser chamada centenas de vezes por página.
Para ver a versão anterior do código substituída (mas é funcionalmente equivalente e 5x mais rápida), veja o histórico de revisões desta postagem (clique no link da data).
Além disso, o
RemapInternationalCharToAscii
código fonte do método pode ser encontrado aqui .fonte
RemapInternationalCharToAscii()
a função está lá meta.stackexchange.com/questions/7435/...if (prevdash) sb.Length -= 1; return sb.ToString();
vez da últimaif
declaração.sb.Length == maxlen break;
está com erros se o sinal no maxLenght-1 for "ß", ele for convertido para "ss"sb.Length == maxlene
nunca será verdadeiro, é melhor testar(sb.Length > = maxlen)
.Aqui está minha versão do código de Jeff. Fiz as seguintes alterações:
A conversão de caso agora também é opcional.
Para obter mais detalhes, os testes de unidade e uma explicação de por que o esquema de URL do Facebook é um pouco mais inteligente que o Stack Overflows, tenho uma versão expandida disso no meu blog .
fonte
if (i == maxlen) break;
para que, emif (sb.Length == maxlen) break;
vez disso, se você passar uma string com muitos caracteres em branco / inválidos, ainda poderá obter uma lesma do comprimento desejado, enquanto o código em si pode acabar truncando massivamente (por exemplo, considere o caso em que você começa com 80 espaços ...). E um benchmark aproximado de 10.000.000 de iterações contra o código de Jeff mostrou que ele tem aproximadamente a mesma velocidade.Você desejará configurar uma rota personalizada para apontar a URL para o controlador que a manipulará. Como você está usando Ruby on Rails, aqui está uma introdução ao uso do mecanismo de roteamento.
No Ruby, você precisará de uma expressão regular como você já conhece e aqui está a expressão regular a ser usada:
fonte
Você também pode usar esta função JavaScript para geração em forma de lesmas (esta é baseada / copiada do Django ):
fonte
Para uma boa medida, aqui está a função PHP no WordPress que faz isso ... Eu acho que o WordPress é uma das plataformas mais populares que usam links sofisticados.
Esta função, bem como algumas das funções de suporte, podem ser encontradas em wp-includes / formatting.php.
fonte
remove_accents
,seems_utf8
...git clone git://core.git.wordpress.org/
e encontrar owp-includes/formatting.php
arquivo emSe você estiver usando a borda do Rails, poderá confiar no Inflector.parametrize - aqui está o exemplo da documentação:
Além disso, se você precisar lidar com caracteres mais exóticos, como acentos (éphémère) na versão anterior do Rails, poderá usar uma mistura de PermalinkFu e DiacriticsFu :
fonte
Não estou familiarizado com o Ruby on Rails, mas o seguinte é o código PHP (não testado). Você provavelmente pode traduzir isso muito rapidamente para Ruby on Rails, se achar útil.
Eu espero que isso ajude.
fonte
Eu não gosto muito de Ruby ou Rails, mas em Perl, é isso que eu faria:
Acabei de fazer um teste rápido e parece funcionar. Espero que isso seja relativamente fácil de traduzir para Ruby.
fonte
Implementação T-SQL, adaptada de dbo.UrlEncode :
fonte
Eu sei que é uma pergunta muito antiga, mas como a maioria dos navegadores agora suporta URLs unicode , encontrei uma ótima solução no XRegex que converte tudo, exceto letras (em todos os idiomas para '-').
Isso pode ser feito em várias linguagens de programação.
O padrão é
\\p{^L}+
e você só precisa usá-lo para substituir todas as letras que não sejam '-'.Exemplo de trabalho no node.js com o módulo xregex .
fonte
Supondo que sua classe de modelo tenha um atributo title, você pode simplesmente substituir o método to_param dentro do modelo, assim:
Este episódio do Railscast tem todos os detalhes. Você também pode garantir que o título contenha apenas caracteres válidos usando este:
fonte
Código de Brian, em Ruby:
downcase
transforma a string para minúsculas,strip
remove esquerda e à direita espaço em branco, a primeiragsub
chamada g lobally sub espaços stitutes com traços, eo segundo remove tudo o que não é uma letra ou um traço.fonte
Existe um pequeno plugin Ruby on Rails chamado PermalinkFu , que faz isso. O método de escape faz a transformação em uma sequência que é adequada para uma URL . Dê uma olhada no código; esse método é bastante simples.
Para remover caracteres não ASCII , ele usa a iconv lib para traduzir para 'ascii // ignore // translit' de 'utf-8'. Os espaços são então transformados em traços, tudo é minucioso etc.
fonte
Você pode usar o seguinte método auxiliar. Ele pode converter os caracteres Unicode.
fonte
Aqui está a minha versão (mais lenta, mas divertida de escrever) do código de Jeff:
Minha sequência de teste:
" I love C#, F#, C++, and... Crème brûlée!!! They see me codin'... they hatin'... tryin' to catch me codin' dirty... "
fonte
A solução stackoverflow é ótima, mas o navegador moderno (excluindo o IE, como de costume) agora lida com a codificação utf8:
Então, atualizei a solução proposta:
Código completo em Pastebin
Edit: Aqui está o código do
RemapInternationalCharToAscii
método (que está faltando no pastebin).fonte
Eu gostei da maneira como isso é feito sem o uso de expressões regulares , então eu o transportei para o PHP. Acabei de adicionar uma função chamada
is_between
para verificar caracteres:fonte
Agora, todos os navegadores lidam com a codificação utf8, para que você possa usar o método WebUtility.UrlEncode , como o HttpUtility.UrlEncode usado pelo @giamin, mas que funciona fora de um aplicativo da web.
fonte
Portei o código para o TypeScript. Pode ser facilmente adaptado ao JavaScript.
Estou adicionando um
.contains
método aoString
protótipo. Se você estiver direcionando os navegadores mais recentes ou o ES6, poderá usar.includes
.fonte
Não não não. Vocês estão todos muito errados. Exceto pelo material diacrítico-fu, você está chegando lá, mas e quanto aos personagens asiáticos (que vergonha para os desenvolvedores Ruby por não considerarem seus irmãos nihonjin ).
O Firefox e o Safari exibem caracteres não ASCII no URL e, francamente, ficam ótimos. É bom oferecer suporte a links como ' http://somewhere.com/news/read/ ' '' '' '.
Então, aqui está um código PHP que fará isso, mas eu apenas escrevi e não o testei sob estresse.
Exemplo:
Saídas: コ リ and e-ー マ and e- ア ー ノ ル ド
O '- e -' é porque & é alterado para '- e -'.
fonte