language-agnostic string seo slug

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:

  1. convertir cadena a minúsculas
  2. reemplazar caracteres no deseados por guiones
  3. reemplazar múltiples guiones por un guión (No es necesario ya que la llamada a función preg_replace() ya previene múltiples guiones)
  4. eliminar hypens al principio y al final si es necesario
  5. 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?