it-swarm-id.com

Bagaimana Anda menghapus karakter yang tidak valid saat membuat url ramah (yaitu bagaimana Anda membuat siput)?

Katakanlah saya memiliki halaman web ini: http://ww.xyz.com/Product.aspx?CategoryId=1

Jika nama CategoryId = 1 adalah "Anjing", saya ingin mengonversi URL menjadi seperti ini: http://ww.xyz.com/Products/Dogs

Masalahnya adalah jika nama kategori mengandung karakter asing (atau tidak valid untuk url). Jika nama CategoryId = 2 adalah "Göra äldre", apa yang harus menjadi URL baru?

Logikanya seharusnya: http://ww.xyz.com/Products/Göra äldre tetapi tidak akan berfungsi.

Pertama karena spasi (yang saya dapat dengan mudah diganti dengan tanda hubung misalnya) tetapi bagaimana dengan karakter asing? Di Asp.net saya bisa menggunakan fungsi URLEncode yang akan memberikan sesuatu seperti ini: http://ww.xyz.com/Products/G%c3%b6ra+%c3%a4ldre tapi saya tidak bisa mengatakan itu lebih baik daripada URL asli (http://ww.xyz.com/Product.aspx?CategoryId=2).

Idealnya saya ingin membuat yang ini tetapi bagaimana saya bisa melakukan ini secara otomatis (yaitu mengubah karakter asing ke karakter URL 'aman'): http://ww.xyz.com/Products/Gora-aldre.

6
Anthony

Saya telah menemukan 2 metode ekstensi berikut (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

Itu tergantung pada bahasa yang Anda gunakan dan teknik yang ingin Anda gunakan. Lihatlah cuplikan JavaScript ini dari sumber Django, ia melakukan persis seperti yang Anda butuhkan. Anda bisa dengan mudah mem-portingnya ke bahasa pilihan Anda.

Ini adalah cuplikan Python yang digunakan dalam fungsi slugify Django, jauh lebih pendek:

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)

Saya pikir setiap bahasa memiliki port ini, karena ini adalah masalah umum. Hanya Google untuk + slugify bahasa Anda.

2
D4V360

Anda bisa menambahkan bidang baru ke tabel Produk yang berisi URL aman dan nama unik untuk setiap produk. Ini mungkin dapat secara otomatis dihasilkan pada awalnya (menggantikan karakter yang tidak aman dengan padanan aman terdekat - gora-aldre?) Dan kemudian disesuaikan dengan kebutuhan.

Karena penggantian karakter yang tidak aman tidak (selalu) reversibel, itu tidak sepenuhnya layak untuk melakukan hal seperti ini dengan cepat.

Atau, Anda membuat URL dengan demikian:

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

Di mana safe-string dibuat dengan cepat menggantikan karakter yang tidak aman sesuai kebutuhan. Angka 1234 adalah kunci produk. Anda menggunakan kunci untuk mencari produk, 'safe-string' ada lebih banyak untuk pengguna dan mesin pencari.

1
Kris

Dua hal yang perlu diingat:

  1. Penulisan ulang URL umumnya tidak memiliki efek positif pada mesin pencari (dan sering yang negatif) - jadi Anda hanya harus melakukannya jika Anda mengetahui efek positif yang terukur pada kepuasan pengguna (dan karenanya: buat URL Anda bermanfaat bagi pengguna) .

  2. Jika Anda memutuskan untuk melakukan penulisan ulang URL, Anda harus memiliki rincian teknis dengan sempurna. Misalnya, Anda tidak boleh memiliki lebih dari satu URL unik yang menunjukkan konten yang sama. Pastikan Anda menggunakan UTF-8 untuk pengkodean konten non-ASCII, gunakan tautan kabur dalam konten Anda, dan umumnya uji pada berbagai browser untuk memastikan semuanya berjalan sesuai rencana. Jika semua ini asing bagi Anda, maka saya sangat menyarankan untuk tidak melakukan penulisan ulang URL untuk saat ini.

FWIW Beberapa masalah sisi mesin pencari dibahas di http://googlewebmastercentral.blogspot.com/2008/09/dynamic-urls-vs-static-urls.html

1
John Mueller

Metode IMO terbaik adalah daftar putih karakter daripada mencoba mencari karakter yang tidak valid. Namun, karakter beraksen seperti é cukup umum (dan URL Anda akan aneh tanpa mereka) sehingga Anda dapat mengonversi ini terlebih dahulu.

Dalam PHP Anda dapat menggunakan fungsi strtr, tetapi Anda harus dapat memodifikasi ini untuk kebutuhan Anda di asp.net:

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

Sekarang inilah proses Anda:

  1. [opsional] Ubah string menjadi huruf kecil (biasanya disarankan untuk URL).
  2. [opsional] Konversikan karakter beraksen menggunakan pemetaan di atas.
  3. Jalankan melalui string input Anda karakter-oleh-karakter.
  4. Mungkin lebih cepat untuk melakukan # 1 dan # 2 per karakter daripada keseluruhan string, tergantung pada fungsi bawaan yang Anda miliki.
  5. Jika karakter berada dalam kisaran a-z atau -9, tambahkan ke string baru Anda, jika tidak:
    a) Jika Anda sudah memiliki tanda hubung di ujung string baru Anda, abaikan saja
    b) Jika tidak, tambahkan tanda hubung ke akhir string.
  6. Saat Anda mencapai akhir, singkirkan dan pimpin atau ikuti tanda hubung dan selesai!
1
DisgruntledGoat

Karena postingan Anda ditandai ASP.Net: lihat situs ini , itu berisi kode sampel untuk mengganti (kebanyakan) teks dengan diakritik (karakter tidak valid yang Anda panggil) dengan karakter dasarnya.

Seperti yang disebutkan Kris, gunakan ID unik di url Anda, seperti situs ini. Jika Anda tidak memiliki kendali atas ID yang diberikan kepada Anda, Anda harus membuat tabel terjemahan, yang berisi ID unik Anda, dengan ID unik eksternal. Dengan begitu referensi internal Anda juga bagus ketika ID eksternal berubah. Bersama dengan ID unik Anda, Anda menyimpan "Cari dan ID Manusia yang dioptimalkan", yang tidak begitu unik, tetapi terlihat bagus.

0
GvS

Wikipedia sering menggunakan karakter non-latin1 dalam URL mereka. Tidak ada alasan (di luar server web Anda yang tidak mendukungnya) bahwa Anda tidak boleh menggunakan URL ini.

Namun; Jika Anda harus menghindari karakter ini, saya telah menemukan bahwa menggantinya dengan bentuk non - diakritik . Kebanyakan orang yang membaca ini dapat mengetahui (dari konteks) apa yang seharusnya menjadi Firman meskipun para diakritik telah dihapus.

0
Greg B