Creare un permalink con JavaScript
-
22-09-2019 - |
Domanda
Ho una casella di testo in cui un utente pone una stringa come questa:
"hello world! I think that __i__ am awesome (yes I am!)"
Ho bisogno di creare un URL corretto in questo modo:
hello-world-i-think-that-i-am-awesome-yes-i-am
Come può essere fatto utilizzando le espressioni regolari?
Inoltre, è possibile farlo con greca (per esempio)?
"Γεια σου κόσμε"
si rivolge a
geia-sou-kosme
In altri linguaggi di programmazione ( Python / rubino ) sto usando un array di traduzione. Dovrei fare lo stesso qui?
Soluzione
Prova questo:
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
Per quanto riguarda i caratteri greci, sì Non posso pensare a niente altro che una sorta di tabella di ricerca utilizzato da un altro regexp.
Modifica , ecco la versione oneliner:
Modifica , ha aggiunto toLowerCase ():
Modifica , correzione imbarazzante per la regexp finale:
function doDashes2(str) {
return str.replace(/[^a-z0-9]+/gi, '-').replace(/^-*|-*$/g, '').toLowerCase();
}
Altri suggerimenti
Una semplice espressione regolare per fare questo lavoro è la corrispondenza di tutti i caratteri "non-parola", e sostituirli con un -
. Ma prima di questo corrispondenti regex, convertire la stringa in minuscolo. Questo da solo non è infallibile, dal momento che un trattino alla fine può essere possibile.
[^a-z]+
In questo modo, dopo la sostituzione; è possibile tagliare i trattini (dalla parte anteriore e posteriore) usando questo regex:
^-+|-+$
Dovreste creare greco-to-latin glyps traduzione voi stessi, espressione regolare non si può fare lì. Utilizzando una matrice di traduzione è una buona idea.
Non posso davvero dire per greco personaggi, ma per il primo esempio, un semplice:
/[^a-zA-Z]+/
farà il trucco quando lo si utilizza come modello, e sostituendo le partite con un "-"
Come per i caratteri greci, suggerirei usando un array con tutte le "traduzioni di carattere", e quindi aggiungendo suoi valori per l'espressione regolare.
Per circa costruire l'url si avrebbe bisogno di qualcosa di simile.
var textbox = "hello world! I think that __i__ am awesome (yes I am!)";
var url = textbox.toLowerCase().replace(/([^a-z])/, '').replace(/\s+/, " ").replace(/\s/, '-');
Si rimuove semplicemente tutti i caratteri non alfa, rimuove spaziatura doppia, e poi sostituisce tutti i caratteri spazio con un trattino.
Si potrebbe utilizzare un'altra espressione regolare per sostituire i caratteri greci con caratteri inglesi.