2009-01-21 8 views
17

toman una cadena como:¿Cómo puedo crear una URL de SEO delimitada por guiones de una cadena?

En C#: ¿Cómo agrego "comillas" alrededor de cadena en una lista separada por comas de cadenas?

y convertirlo a:

en-c-how-do-i-add-cotizaciones en torno a-cadena-in-a-delimitado por comas-lista-de-cuerdas

Requisitos:

  • independiente cada palabra de un guión y eliminar toda la puntuacion
  • (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 en minúsculas.

En una nota aparte, ¿debería haber una longitud mínima?

+1

aquí hay algo de información sobre url longitud: http: //www.boutell.com/newfaq/misc/urllength.html – bchhun

+1

Quizás reemplazando algunos caracteres especiales con su "pronunciación en inglés", p. "#" => "nítido", permitiría hacer mejores URL y diferenciar C de C# (que es bueno, correcto;)?)? – Wookai

+0

Sí, definitivamente, excepto # no es nítida, eso es un símbolo diferente; p – Shawn

Respuesta

10

Aquí es 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(); 
} 
2

he aquí 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 los URIs ser tipificable, que no necesitan ser pequeño. Pero debes especificar un máximo para que las URL funcionen bien con proxies, etc.

7

me siga estos pasos: secuencia

  1. convertido a minúsculas
  2. reemplazar los caracteres deseados por guiones
  3. reemplazar varios guiones por un guión(no es necesario que la llamada preg_replace() función ya previene múltiples guiones)
  4. eliminar las hiperas al principio y al final si es necesario
  5. ajuste si es necesario desde el último guión antes de la posición x para el final

Así, 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; 
} 
+0

Me gusta esta solución. Intentaba hacer esto al hacer coincidir todos los caracteres no alfanuméricos y dividirlos en uniones, seguí tratando de hacer coincidir solo si no eran el principio o el final de la cadena, pero nunca funcionó. Al final me decidí por hacer coincidir las palabras y anexarlas. – Shawn

+0

¿Qué sucede si la primera palabra es más larga que la longitud máxima? – Wookai

+0

devolvió una subcadena en esa situación – Shawn

4

C#

public string toFriendly(string subject) 
{ 
    subject = subject.Trim().ToLower(); 
    subject = Regex.Replace(subject, @"\s+", "-"); 
    subject = Regex.Replace(subject, @"[^A-Za-z0-9_-]", ""); 
    return subject; 
} 
+0

creo que esto tiene algunos problemas porque ¿qué pasa con esta situación: (cadena) algún Objeto falla. se convierte en: stringsomeobject-failed – Shawn

+1

que se me ocurrió, pero francamente no estoy seguro de cómo me gustaría manejarlo. En el pasado, he ido con el nuking todo entre e incluyendo los parens, pero sospecho que es específico de la implementación. Sin embargo, independientemente de lo que quieras, es trivial agregarlo a la plantilla anterior. – annakata

0

Una manera ligeramente más limpia de hacer t su 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; 
} 

La fuerza también lo hacen la trim() al comienzo lo que hay menos para procesar más tarde y la sustitución completa se realiza con la preg_replace().

Thxs a CG para dar con la mayor parte de esto: What is the best way to clean a string for placement in a URL, like the question name on SO?

2

Una mejor versión:

function Slugify($string) 
{ 
    return strtolower(trim(preg_replace(array('~[^0-9a-z]~i', '~-+~'), '-', $string), '-')); 
} 
0

En una URL dinámica, estos ID se transmiten a través de la cadena de consulta para un script que .. . como el carácter delimitador porque la mayoría de los motores de búsqueda tratan el tablero como ... NET: Guía de un desarrollador de SEO también abarca estos tres métodos adicionales search engine optimization

1

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.

1

solución con cáscara:

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/' 
0

Otra temporada, otra de las razones, por la elección de Rubí :)

def seo_friendly(str) 
    str.strip.downcase.gsub /\W+/, '-' 
end 

eso es todo.

+0

¿qué tal dasherize :) –

+0

Eso es para Rails, no para Vanilla Ruby. – edgerunner

0

en Python, (si está instalado Django, 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?") 
1

Esto se acerca a la forma de desbordamiento de pila 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; 
} 
Cuestiones relacionadas