ti-enxame.com

Como você remove caracteres inválidos ao criar um URL amigável (ou seja, como você cria uma lesma)?

Digamos que eu tenho esta página da web: http://ww.xyz.com/Product.aspx?CategoryId=1

Se o nome de CategoryId = 1 for "Dogs", gostaria de converter o URL em algo assim: http://ww.xyz.com/Products/Dogs

O problema é se o nome da categoria contiver caracteres estrangeiros (ou inválidos para um URL). Se o nome de CategoryId = 2 for "Göra äldre", qual deve ser o novo URL?

Logicamente, deve ser: http://ww.xyz.com/Products/Göra äldre, mas não funcionará.

Primeiro por causa do espaço (que eu posso substituir facilmente por um traço, por exemplo), mas e os caracteres estrangeiros? No Asp.net, eu poderia usar a função URLEncode que daria algo assim: http://ww.xyz.com/Products/G%c3%b6ra+%c3%a4ldre, mas não posso dizer que seja melhor que a URL original (http://ww.xyz.com/Product.aspx?CategoryId=2).

Idealmente, eu gostaria de gerar este, mas como posso fazer isso automaticamente (ou seja, converter caracteres estrangeiros em caracteres de URL 'seguros'): http://ww.xyz.com/Products/Gora-aldre.

6
Anthony

Eu vim com os 2 métodos de extensão a seguir (asp.net/C #):

public static string RemoveAccent(this string txt)
{
    byte[] bytes = System.Text.Encoding.GetEncoding("Cyrillic").GetBytes(txt);
    return System.Text.Encoding.ASCII.GetString(bytes);
}

public static string Slugify(this string phrase)
{
    string str = phrase.RemoveAccent().ToLower();
    str = System.Text.RegularExpressions.Regex.Replace(str, @"[^a-z0-9\s-]", ""); // Remove all non valid chars          
    str = System.Text.RegularExpressions.Regex.Replace(str, @"\s+", " ").Trim(); // convert multiple spaces into one space  
    str = System.Text.RegularExpressions.Regex.Replace(str, @"\s", "-"); // //Replace spaces by dashes
    return str;
}
3
Anthony

Depende do idioma que você está usando e da técnica que deseja usar. Dê uma olhada neste trecho de JavaScript da fonte Django, ele faz exatamente o que você precisa. Você pode facilmente portá-lo para o idioma de sua escolha, eu acho.

Este é o trecho Python usado na função slugify Django, é muito mais curto:

def slugify(value):
    """
    Normalizes string, converts to lowercase, removes non-alpha characters,
    and converts spaces to hyphens.
    """
    import unicodedata
    value = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore')
    value = unicode(re.sub('[^\w\s-]', '', value).strip().lower())
    return re.sub('[-\s]+', '-', value)

Eu acho que todas as línguas têm uma porta disso, pois é um problema comum. Apenas Google para slugify + seu idioma.

2
D4V360

Você pode adicionar um novo campo à tabela Produtos que contenha um nome exclusivo e seguro de URL para cada produto. Provavelmente isso poderia ser gerado automaticamente inicialmente (substituindo caracteres não seguros pelo equivalente mais próximo seguro - gora-aldre?) E depois ajustado conforme necessário.

Como a substituição de caracteres não seguros não é (sempre) reversível, não é totalmente viável fazer esse tipo de coisa em tempo real.

Como alternativa, você cria a URL assim:

http://example.com/products/1234/safe-string

Onde safe-string é criado em tempo real, substituindo caracteres não seguros conforme necessário. O número 1234 é a chave do produto. Você usa a chave para procurar o produto, a 'string segura' existe mais para o usuário e os mecanismos de pesquisa.

1
Kris

Duas coisas a ter em mente:

  1. A reescrita de URL geralmente não tem um efeito positivo nos mecanismos de pesquisa (e freqüentemente negativo) - portanto, você deve fazê-lo apenas se souber de um efeito positivo mensurável na satisfação do usuário (e, consequentemente: tornar seus URLs úteis para os usuários) .

  2. Se você decidir reescrever URL, deverá ter os detalhes técnicos perfeitamente. Por exemplo, você nunca deve ter mais de um URL exclusivo mostrando o mesmo conteúdo. Certifique-se de usar UTF-8 para a codificação de conteúdo não ASCII, use links de escape no seu conteúdo e faça testes em vários navegadores para garantir que tudo funcione conforme planejado. Se algo disso é estranho para você, eu recomendo fortemente não fazer a reescrita de URL no momento.

FWIW Alguns dos problemas do lado do mecanismo de pesquisa são abordados em http://googlewebmastercentral.blogspot.com/2008/09/dynamic-urls-vs-static-urls.html

1
John Mueller

O melhor método para IMO é lista de permissões caracteres em vez de tentar procurar caracteres inválidos. No entanto, caracteres acentuados como é são bastante comuns (e seu URL será ímpar sem eles) para que você possa convertê-los primeiro.

Em PHP, você pode usar a função strtr, mas poderá modificar isso para suas necessidades no asp.net:

strtr(
  'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿŔŕ',
  'aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyybyrr'
);

Agora, aqui está o seu processo:

  1. [opcional] Converta a string para minúscula (geralmente recomendada para URLs).
  2. [opcional] Converta os caracteres acentuados usando o mapeamento acima.
  3. Execute sua cadeia de entrada caractere por caractere.
  4. Pode ser mais rápido executar os números 1 e 2 por caractere, em vez de em toda a cadeia, dependendo das funções internas que você possui.
  5. Se o caractere estiver no intervalo a-z ou -9, adicione-o à sua nova string, caso contrário:
    a) Se você já possui um hífen no final de sua nova string, ignore-o
    b) Caso contrário, adicione um hífen ao final da string.
  6. Quando você chegar ao fim, remova e conduza ou siga hífens e pronto!
1
DisgruntledGoat

Como você publica a tag ASP.Net: consulte este site , ele contém um código de exemplo para substituir (a maioria) o texto por sinais diacríticos (caracteres inválidos que você os chama) pelo caractere base.

Como Kris mencionou, use um ID exclusivo no seu URL, como este site. Se você não tem controle sobre os IDs fornecidos a você, crie uma tabela de conversão que contenha seu ID exclusivo, com os IDs externos exclusivos. Dessa forma, suas referências internas também são boas quando o ID externo é alterado. Juntamente com o seu ID exclusivo, você armazena o seu "ID otimizado para pesquisa e humanos", aquele que não é tão exclusivo, mas que fica bem.

0
GvS

A Wikipedia costuma usar caracteres não latin1 em seus URLs. Não há motivo (além do servidor da web que não os suporte) que você não deve usar esses URLs.

Contudo; Se você precisar evitar esses caracteres, descobri que eles foram substituídos pelo formato não - diacrítico . A maioria das pessoas que lê isso pode dizer (por contexto) o que a Palavra deveria ser, mesmo que os sinais diacríticos tenham sido removidos.

0
Greg B