2010-07-18 14 views
10

Dire che ho il sito:
http://ww.xyz.com/Product.aspx?CategoryId=1Come si rimuovono i caratteri non validi durante la creazione di un URL amico (es. Come si crea una lumaca)?

Se il nome di CategoryId = 1 è "Dogs" Vorrei convertire l'URL in qualcosa di simile a questo:
http://ww.xyz.com/Products/Dogs

Il problema è se il il nome della categoria contiene caratteri stranieri (o non validi per un URL). Se il nome di CategoryId = 2 è "Göra äldre", quale dovrebbe essere il nuovo URL?

Logicamente dovrebbe essere:
http://ww.xyz.com/Products/Göra äldre
ma non funzionerà. Innanzitutto a causa dello spazio (che posso facilmente sostituire con un trattino per esempio) ma per quanto riguarda i personaggi stranieri? In Asp.net ho potuto utilizzare la funzione URLEncode che darebbe qualcosa di simile:
http://ww.xyz.com/Products/G%c3%b6ra+%c3%a4ldre
ma non posso davvero dire che è meglio che l'URL originale (http://ww.xyz.com/Product.aspx?CategoryId=2)

Idealmente vorrei generare questo uno ma come posso fare questo automaticamente (cioè la conversione di caratteri stranieri a caratteri url 'sicuri'):
http://ww.xyz.com/Products/Gora-aldre

risposta

24

mi è venuta in mente i seguenti 2 metodi di estensione (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

Ho scritto un enorme metodo pieno di istruzioni if ​​usando la classe char fino a quando ho trovato questo. Roba buona. –

+0

Penso che ISAPI faccia lo stesso, ma voglio più controllo sui miei URL. Questa è una buona soluzione. –

+1

Grazie per la funzione.Ho dovuto aggiungere un altro pezzo alla fine per sostituire due o più trattini con un trattino singolo. str = System.Text.RegularExpressions.Regex.Replace (str, @ "\ - +", "-"); // converti più trattini in un trattino –

2

traslitterare caratteri non ASCII a ASCII, utilizzando qualcosa di simile:

var str = "éåäöíØ"; 
var noApostrophes = Encoding.ASCII.GetString(Encoding.GetEncoding("Cyrillic").GetBytes(str)); 

=> "eaaoiO" 

(Source)

+1

Cosa succede se alcuni caratteri non sono in cirillico? Ho bisogno di una soluzione che funzioni sempre. – Anthony

+0

Quindi dovrai aggiungere ulteriori controlli per diversi tipi di codifica. Sfortunatamente non c'è una bacchetta magica qui a meno che tu non usi una biblioteca che fa tutto per te. – hollsk

+1

Forse la libreria UnidecodeSharp è ciò che stai cercando: http://unidecode.codeplex.com/ – Sjoerd

-1

Io uso la funzione descritta al http://www.blackbeltcoder.com/Articles/strings/converting-text-to-a-url-friendly-slug. Non supporta direttamente caratteri non inglesi, ma potrebbe essere facilmente aggiornato per supportare caratteri aggiuntivi.

Mi piace perché produce una lumaca molto pulita.

+0

Nella tua funzione TextToSlug cosa succede se la stringa da convertire contiene un accento? Ad esempio "fidanzato" che è una perfetta parola inglese. Ci sono molti esempi simili in inglese. IsLetterOrDigit restituirà true per il carattere é in modo che tu possa finire con esso nel tuo URL che sarebbe errato in quanto idealmente dovrebbe essere convertito in e nella url. – Anthony

+0

Cosa significa "idealmente" qui? Stai dicendo che il fidanzato non è valido all'interno di un URL? Questo non è venuto mentre ho usato il mio codice, ma sono più che felice di modificarlo se questo causa problemi. –

0

Un altra cosa da prendere in considerazione:

Se un utente fornisce una stringa come 好听的音乐 che si desidera convertire a un titolo friendly URL allora si dovrebbe considerare l'utilizzo di IdnMapping

Ad esempio:

string urlFriendlyTitle = Slugify(url); 

public static string Slugify(string text) 
{ 
    IdnMapping idnMapping = new IdnMapping(); 
    text = idnMapping.GetAscii(text); 

    text = RemoveAccent(text).ToLower(); 

    // Remove all invalid characters. 
    text = Regex.Replace(text, @"[^a-z0-9\s-]", ""); 

    // Convert multiple spaces into one space 
    text = Regex.Replace(text, @"\s+", " ").Trim(); 

    // Replace spaces by underscores. 
    text = Regex.Replace(text, @"\s", "_"); 

    return text; 
} 

public static string RemoveAccent(string text) 
{ 
    byte[] bytes = Encoding.GetEncoding("Cyrillic").GetBytes(text); 

    return Encoding.ASCII.GetString(bytes); 
} 

Senza questo, 好听的音乐 verrà convertito in string.Empty. Con questo, xn--fjqr6lw2ek78az68a che è punycode

Problemi correlati