Sin embargo, hay varias cosas que podrían mejorarse en la solución de Jeff.
if (String.IsNullOrEmpty(title)) return "";
En mi humilde opinión, no es el lugar para probar esto. Si la función se pasa una cadena vacía, algo salió muy mal de todos modos. Lanzar un error o no reaccionar en absoluto.
// remove any leading or trailing spaces left over
… muuuch later:
// remove trailing dash, if there is one
Dos veces el trabajo. Teniendo en cuenta que cada operación crea una cadena completamente nueva, esto es malo, incluso si el rendimiento no es un problema.
// replace spaces with single dash
title = Regex.Replace(title, @"\s+", "-");
// if we end up with multiple dashes, collapse to single dash
title = Regex.Replace(title, @"\-{2,}", "-");
Una vez más, básicamente el doble de trabajo: Primero, use regex para reemplazar múltiples espacios a la vez. Luego, usa regex nuevamente para reemplazar múltiples guiones a la vez. Dos expresiones para analizar, dos autómatas para construir en la memoria, iterar dos veces sobre la cadena, crear dos cadenas: todas estas operaciones pueden colapsarse en una sola.
De la parte superior de mi cabeza, sin ninguna prueba en absoluto, esto sería una solución equivalente:
// make it all lower case
title = title.ToLower();
// remove entities
title = Regex.Replace(title, @"&\w+;", "");
// remove anything that is not letters, numbers, dash, or space
title = Regex.Replace(title, @"[^a-z0-9\-\s]", "");
// replace spaces
title = title.Replace(' ', '-');
// collapse dashes
title = Regex.Replace(title, @"-{2,}", "-");
// trim excessive dashes at the beginning
title = title.TrimStart(new [] {'-'});
// if it's too long, clip it
if (title.Length > 80)
title = title.Substring(0, 79);
// remove trailing dashes
title = title.TrimEnd(new [] {'-'});
return title;
Tenga en cuenta que este método utiliza funciones de cadena en lugar de las funciones de expresiones regulares y funciones de char en lugar de funciones de cadena siempre que sea posible .
Respuesta excelente gracias, también agregué URL = Regex.Replace (URL, @ "<(.|\n)*?>", ""); para eliminar etiquetas HTML como "mi artículo aquí" se convertirá en "my-barticleb-aquí" –
Una ruta tampoco puede finalizar con un punto. Además, no estoy seguro de por qué usa new [] {'-'}, cuando podría usar '-'. –