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
mappara 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"
}