language agnostic - ¿Cómo puedo crear una URL de SEO delimitada por guiones de una cadena?
language-agnostic string (12)
Aquí está mi solución en C #
private string ToSeoFriendly(string title, int maxLength) {
var match = Regex.Match(title.ToLower(), "[//w]+");
StringBuilder result = new StringBuilder("");
bool maxLengthHit = false;
while (match.Success && !maxLengthHit) {
if (result.Length + match.Value.Length <= maxLength) {
result.Append(match.Value + "-");
} else {
maxLengthHit = true;
// Handle a situation where there is only one word and it is greater than the max length.
if (result.Length == 0) result.Append(match.Value.Substring(0, maxLength));
}
match = match.NextMatch();
}
// Remove trailing ''-''
if (result[result.Length - 1] == ''-'') result.Remove(result.Length - 1, 1);
return result.ToString();
}
Tome una cadena como:
En C #: ¿Cómo agrego "Quotes" alrededor de la cadena en una lista de cadenas delimitada por comas?
y convertirlo a:
in-c-how-do-i-add-quotes-around-string-in-a-comma-delimited-list-of-strings
Requisitos:
- Separe cada palabra con un guion y elimine toda la puntuación (teniendo en cuenta que no todas las palabras están separadas por espacios).
- La función toma una longitud máxima y obtiene todos los tokens por debajo de esa longitud máxima. Ejemplo:
ToSeoFriendly("hello world hello world", 14)
devuelve"hello-world"
- Todas las palabras se convierten a minúsculas.
En una nota separada, ¿debería haber una longitud mínima?
Aquí hay una solución para php:
function make_uri($input, $max_length) {
if (function_exists(''iconv'')) {
$input = @iconv(''UTF-8'', ''ASCII//TRANSLIT'', $input);
}
$lower = strtolower($input);
$without_special = preg_replace_all(''/[^a-z0-9 ]/'', '''', $input);
$tokens = preg_split(''/ +/'', $without_special);
$result = '''';
for ($tokens as $token) {
if (strlen($result.''-''.$token) > $max_length+1) {
break;
}
$result .= ''-''.$token;
}
return substr($result, 1);
}
uso:
echo make_uri(''In C#: How do I add "Quotes" around string in a ...'', 500);
A menos que necesite que los uris sean tipables, no es necesario que sean pequeños. Pero debes especificar un máximo para que las URL funcionen bien con proxies, etc.
DO#
public string toFriendly(string subject)
{
subject = subject.Trim().ToLower();
subject = Regex.Replace(subject, @"/s+", "-");
subject = Regex.Replace(subject, @"[^A-Za-z0-9_-]", "");
return subject;
}
Yo seguiría estos pasos:
- convertir cadena a minúsculas
- reemplazar caracteres no deseados por guiones
reemplazar múltiples guiones por un guión(No es necesario ya que la llamada a funciónpreg_replace()
ya previene múltiples guiones)- eliminar hypens al principio y al final si es necesario
- recorte si es necesario desde el último guión antes de la posición x hasta el final
Entonces, todos juntos en una función (PHP):
function generateUrlSlug($string, $maxlen=0)
{
$string = trim(preg_replace(''/[^a-z0-9]+/'', ''-'', strtolower($string)), ''-'');
if ($maxlen && strlen($string) > $maxlen) {
$string = substr($string, 0, $maxlen);
$pos = strrpos($string, ''-'');
if ($pos > 0) {
$string = substr($string, 0, $pos);
}
}
return $string;
}
Una mejor versión:
function Slugify($string)
{
return strtolower(trim(preg_replace(array(''~[^0-9a-z]~i'', ''~-+~''), ''-'', $string), ''-''));
}
En una URL dinámica, estos identificadores se pasan a través de la cadena de consulta a una secuencia de comandos que ... como el carácter delimitador porque la mayoría de los motores de búsqueda tratan el guión como ... NET: Una Guía del desarrollador para SEO también cubre estos tres métodos adicionales de búsqueda optimización del motor
Solución en Perl:
my $input = ''In C#: How do I add "Quotes" around string in a comma delimited list of strings?'';
my $length = 20;
$input =~ s/[^a-z0-9]+/-/gi;
$input =~ s/^(.{1,$length}).*//L$1/;
print "$input/n";
hecho.
Solución en shell:
echo ''In C#: How do I add "Quotes" around string in a comma delimited list of strings?'' | /
tr A-Z a-z | /
sed ''s/[^a-z0-9]/+/-/g;s/^/(./{1,20/}/).*//1/''
En python, (si django está instalado, incluso si está utilizando otro marco).
from django.template.defaultfilters import slugify
slugify("In C#: How do I add "Quotes" around string in a comma delimited list of strings?")
Otra temporada, otra razón, para elegir Ruby :)
def seo_friendly(str)
str.strip.downcase.gsub //W+/, ''-''
end
Eso es todo.
Esto es parecido a cómo genera babosas:
public static string GenerateSlug(string title)
{
string slug = title.ToLower();
if (slug.Length > 81)
slug = slug.Substring(0, 81);
slug = Regex.Replace(slug, @"[^a-z0-9/-_/./// ]+", "");
slug = Regex.Replace(slug, @"[^a-z0-9]+", "-");
if (slug[slug.Length - 1] == ''-'')
slug = slug.Remove(slug.Length - 1, 1);
return slug;
}
Una forma ligeramente más limpia de hacer esto en PHP al menos es:
function CleanForUrl($urlPart, $maxLength = null) {
$url = strtolower(preg_replace(array(''/[^a-z0-9/- ]/i'', ''/[ /-]+/''), array('''', ''-''), trim($urlPart)));
if ($maxLength) $url = substr($url, 0, $maxLength);
return $url;
}
También podría hacer el trim()
al inicio, por lo que hay menos para procesar más adelante y se realiza el reemplazo completo en preg_replace()
.
Thxs to cg para encontrar la mayor parte de esto: ¿Cuál es la mejor manera de limpiar una cadena para colocarla en una URL, como el nombre de la pregunta en SO?