it-swarm.it

Come si rimuovono i caratteri non validi durante la creazione di un URL amichevole (ovvero come si crea una lumaca)?

Supponiamo di avere questa pagina Web: http://ww.xyz.com/Product.aspx?CategoryId=1

Se il nome di CategoryId = 1 è "Dogs", vorrei convertire l'URL in qualcosa del genere: http://ww.xyz.com/Products/Dogs

Il problema è se il nome della categoria contiene caratteri estranei (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à.

In primo luogo a causa dello spazio (che posso facilmente sostituire con un trattino per esempio) ma che dire dei personaggi stranieri? In Asp.net potrei usare la funzione URLEncode che darebbe qualcosa del genere: http://ww.xyz.com/Products/G%c3%b6ra+%c3%a4ldre ma non posso davvero dire che sia meglio dell'URL originale (http://ww.xyz.com/Product.aspx?CategoryId=2).

Idealmente, vorrei generarlo, ma come posso farlo automaticamente (cioè convertire i caratteri stranieri in caratteri URL "sicuri"): http://ww.xyz.com/Products/Gora-aldre.

6
Anthony

Ho escogitato 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
Anthony

Dipende dalla lingua che stai usando e dalla tecnica che vuoi usare. Dai un'occhiata a questo frammento di JavaScript dalla sorgente Django, fa esattamente quello che ti serve. Puoi facilmente portarlo nella lingua che preferisci, immagino.

Questo è lo snippet Python usato nella funzione slugify Django, è molto più breve:

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)

Penso che ogni lingua abbia una porta di questo, dal momento che è un problema comune. Solo Google per slugify + la tua lingua.

2
D4V360

È possibile aggiungere un nuovo campo alla tabella Prodotti contenente un nome univoco sicuro e univoco per ciascun prodotto. Questo potrebbe probabilmente essere generato automaticamente inizialmente (sostituendo i caratteri non sicuri con l'equivalente sicuro più vicino - gora-aldre?) E quindi perfezionato secondo necessità.

Poiché la sostituzione di personaggi non sicuri non è (sempre) reversibile, non è del tutto possibile fare questo tipo di cose al volo.

In alternativa, si crea l'URL in questo modo:

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

Dove safe-string viene creato al volo sostituendo i caratteri non sicuri in base alle esigenze. Il numero 1234 è il codice Product Key. Usi la chiave per cercare il prodotto, la "stringa sicura" è più adatta all'utente e ai motori di ricerca.

1
Kris

Due cose da tenere a mente:

  1. La riscrittura degli URL in genere non ha un effetto positivo sui motori di ricerca (e spesso uno negativo) - quindi dovresti farlo solo se conosci un effetto misurabile sulla soddisfazione dell'utente (e di conseguenza: rendi i tuoi URL utili per gli utenti) .

  2. Se decidi di riscrivere l'URL, devi avere i dettagli tecnici perfettamente in ordine. Ad esempio, non dovresti mai avere più di un URL univoco con lo stesso contenuto. Assicurati di utilizzare UTF-8 per la codifica di contenuti non ASCII, di utilizzare collegamenti di escape all'interno dei tuoi contenuti e di testare generalmente su vari browser per assicurarti che le cose funzionino come pianificato. Se qualcosa di questo ti è estraneo, ti consiglio vivamente di non riscrivere gli URL per il momento.

FWIW Alcuni problemi relativi ai motori di ricerca sono trattati in http://googlewebmastercentral.blogspot.com/2008/09/dynamic-urls-vs-static-urls.html

1
John Mueller

Il metodo migliore IMO è lista bianca caratteri invece di cercare caratteri non validi. Tuttavia, i caratteri accentati come é sono abbastanza comuni (e il tuo URL sarà strano senza di loro), quindi potresti convertirli prima.

In PHP puoi usare la funzione strtr, ma dovresti essere in grado di modificarlo per le tue esigenze su asp.net:

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

Ora ecco il tuo processo:

  1. [opzionale] Converti la stringa in minuscolo (in genere consigliata per gli URL).
  2. [opzionale] Converti i caratteri accentati usando la mappatura sopra.
  3. Esegui la stringa di input carattere per carattere.
  4. Potrebbe essere più veloce eseguire il numero 1 e il numero 2 per carattere anziché sull'intera stringa, a seconda delle funzioni incorporate che hai.
  5. Se il carattere è compreso nell'intervallo a-z o -9, aggiungilo alla nuova stringa, altrimenti:
    a) Se hai già un trattino alla fine della tua nuova stringa, ignoralo
    b) In caso contrario, aggiungi un trattino alla fine della stringa.
  6. Quando arrivi alla fine, rimuovi e guida o trascina trattini e il gioco è fatto!
1
DisgruntledGoat

Poiché il tuo post è taggato ASP.Net: guarda questo sito , contiene un codice di esempio per sostituire (la maggior parte) del testo con segni diacritici (caratteri non validi che li chiami) con il loro carattere di base.

Come Kris ha menzionato, usa un ID univoco nel tuo URL, come fa questo sito. Se non si ha alcun controllo sugli ID forniti, è necessario creare una tabella di traduzione, che contenga il proprio ID univoco, con gli ID univoci esterni. In questo modo i tuoi riferimenti interni sono utili anche quando l'ID esterno cambia. Insieme al tuo ID univoco, memorizzi il tuo "ID ottimizzato per Ricerca e Human", quello che non è così unico, ma ha un bell'aspetto.

0
GvS

Wikipedia spesso usa caratteri non latini1 nei loro URL. Non c'è motivo (oltre al fatto che il tuo server web non li supporta) che non dovresti usare questi URL.

Però; Se devi evitare questi personaggi, ho scoperto che sostituendoli con il loro modulo non diacritico . La maggior parte delle persone che li leggono possono dire (dal contesto) cosa dovrebbe essere la Parola anche se i segni diacritici sono stati rimossi.

0
Greg B