2010-03-25 12 views
9

Tengo un cuadro de texto donde el usuario pone una cadena como esta:Crear un enlace permanente con JavaScript

"hello world! I think that __i__ am awesome (yes I am!)" 

Necesito crear una URL correcta de esta manera:

hello-world-i-think-that-i-am-awesome-yes-i-am 

¿Cómo puede hacerse usando expresiones regulares?

Además, ¿es posible hacerlo con griego (por ejemplo)?

"Γεια σου κόσμε" 

vuelve a

geia-sou-kosme 

En otros lenguajes de programación (Python/Ruby) estoy usando una matriz de traducción. ¿Debo hacer lo mismo aquí?

Respuesta

13

Prueba esto:

function doDashes(str) { 
    var re = /[^a-z0-9]+/gi; // global and case insensitive matching of non-char/non-numeric 
    var re2 = /^-*|-*$/g;  // get rid of any leading/trailing dashes 
    str = str.replace(re, '-'); // perform the 1st regexp 
    return str.replace(re2, '').toLowerCase(); // ..aaand the second + return lowercased result 
} 
console.log(doDashes("hello world! I think that __i__ am awesome (yes I am!)")); 
// => hello-world-I-think-that-i-am-awesome-yes-I-am 

En cuanto a los caracteres griegos, sí No puedo pensar en otra cosa que una especie de tabla de búsqueda utilizado por otra expresión regular.

Editar, aquí está la versión oneliner:
Editar, agregó toLowerCase():
Editar, solución embarazoso para la expresión regular de arrastre:

function doDashes2(str) { 
    return str.replace(/[^a-z0-9]+/gi, '-').replace(/^-*|-*$/g, '').toLowerCase(); 
} 
+0

Gracias para implementar! – Pindatjuh

+0

Se agregó tolowercasing y una corrección a la expresión regular que maneja la basura principal/final que puede ocurrir. – npup

1

Una simple expresión regular para hacer este trabajo es hacer coincidir todos los caracteres "sin palabra" y reemplazarlos por un -. Pero antes de hacer coincidir esta expresión regular, convierta la cadena a minúsculas. Esto por sí solo no es a prueba de tontos, ya que una carrera en el extremo puede ser posible.

[^a-z]+ 

Por lo tanto, después de la sustitución; se puede recortar los guiones (desde el frente y la parte posterior) utilizando esta expresión regular:

^-+|-+$ 

Habría que crear griego-a-latino glyps traducción a sí mismo, de expresiones regulares no pueden ayudarle allí. Usar una matriz de traducción es una buena idea.

1

Realmente no puedo decir por griegos personajes, pero para el primer ejemplo, un simple:

/[^a-zA-Z]+/ 

hará el truco cuando se utiliza como su patrón, y la sustitución de los partidos con un " - "

Según los caracteres griegos, sugiero usar una matriz con todas las" traducciones de caracteres ", y luego agregar sus valores a la expresión regular.

1

Para construir aproximadamente la URL necesitarás algo como esto.

var textbox = "hello world! I think that __i__ am awesome (yes I am!)"; 
var url = textbox.toLowerCase().replace(/([^a-z])/, '').replace(/\s+/, " ").replace(/\s/, '-'); 

simplemente elimina todos los caracteres no-alfa, elimina doble espacio, y luego reemplaza todos los caracteres de espacio con un guión.

Puede usar otra expresión regular para reemplazar los caracteres griegos con caracteres ingleses.

Cuestiones relacionadas