Saltar al contenido principal

Slug

  • Transliterar los caracteres no ASCII (como Ü, ß, etc.) a su forma equivalente en ASCII.
  • Convertir a minúsculas para consistencia.
  • Reemplazar caracteres no alfanuméricos (como espacios, comas, etc.) por guiones -.
  • Eliminar caracteres no deseados como múltiples guiones consecutivos o espacios adicionales.
  • Eliminar posibles guiones al inicio o al final del slug.

deunicode

  • deunicode(input).to_lowercase(): Convierte la cadena a su forma ASCII y luego la transforma a minúsculas.
  • Reemplazo de caracteres no alfanuméricos: Utiliza map para iterar sobre cada carácter, y si el carácter no es alfanumérico, lo reemplaza por un guion -.
  • Eliminar guiones consecutivos: Reemplaza cualquier ocurrencia de múltiples guiones consecutivos con un solo guion.
  • Eliminar guiones al inicio y al final: Utiliza trim_matches('-') para eliminar guiones que puedan quedar al inicio o al final del slug.
use deunicode::deunicode;

fn create_slug(input: &str) -> String {
// 1. Transliterar caracteres no ASCII y convertir a minúsculas
let mut slug = deunicode(input).to_lowercase();

// 2. Reemplazar caracteres no alfanuméricos por guiones
slug = slug
.chars()
.map(|c| if c.is_alphanumeric() { c } else { '-' })
.collect();

// 3. Eliminar guiones consecutivos
while slug.contains("--") {
slug = slug.replace("--", "-");
}

// 4. Eliminar guiones al inicio y al final
slug.trim_matches('-').to_string()
}

fn main() {
let s = String::from("GRÜßE, JÜRGEN ❤");

// Crear el slug
let slug = create_slug(&s);

println!("{}", slug); // Imprime: "gruesse-jurgen"
}

deunicode y regex

Dependencias

Cargo.toml
[dependencies]
deunicode = "1.1"
regex = "1"

Código

  • Regex::new(r"[^a-z0-9]+"): Reemplaza cualquier secuencia de caracteres que no sean letras minúsculas o números (a-z0-9) por un guion. Se usa + para capturar secuencias de caracteres no deseados y reemplazarlas todas por un solo guion.
  • Este enfoque es más limpio y eficiente, especialmente cuando se trabaja con grandes cantidades de texto o si hay muchas secuencias de caracteres no alfanuméricos que deben ser reemplazadas.
use deunicode::deunicode;
use regex::Regex;

fn create_slug(input: &str) -> String {
// Transliterar caracteres no ASCII y convertir a minúsculas
let slug = deunicode(input).to_lowercase();

// Expresión regular para reemplazar caracteres no alfanuméricos por guiones
let re = Regex::new(r"[^a-z0-9]+").unwrap();
let slug = re.replace_all(&slug, "-");

// Eliminar guiones al inicio y al final
slug.trim_matches('-').to_string()
}

fn main() {
let s = String::from("GRÜßE, JÜRGEN ❤");

let slug = create_slug(&s);

println!("{}", slug); // Imprime: "gruesse-jurgen"
}