2009-09-10 8 views
5

Je construis des sections de nouvelles CMS avec quelques champs mais ceux qui sont particulièrement nécessaires pour cette question sont les champs "Title" et "URL Reference". Lorsqu'un utilisateur entre dans un titre d'article, je veux que Javascript/jQuery remplace le texte du champ Titre et crée un fragment d'URL «propre» en supprimant les espaces et les caractères étranges avec un tiret (-).Javascript Clean URL Regex

par exemple.

Kris FUN nouvel article (titre)

kris-fun-new-article (URL de référence)

Voici le code, mais je ne peux pas à comprendre comment remplacer plusieurs espaces et les caractères spéciaux

 
$('#title').keyup(function(){ 
    var ref = $(this).val().toLowerCase().replace('\ ','-'); 
    $('#reference').val(ref); 
}); 

en outre, comme dans le titre « Kris FUN nouvel article » devrait remplacer l'expression rationnelle « Kris » (citation et de l'espace) avec « kris - » (un tiret). Essentiellement, reconnaissez s'il y a deux caractères spéciaux l'un à côté de l'autre et remplacez par un tiret. PAS comme ça "kris - fun-new-article".

Merci à l'avance

Répondre

10

La réponse de Samir Talwar est correcte, sauf qu'il doit y avoir un indicateur /.../g à la fin de l'expression régulière pour indiquer une correspondance globale. Sans le/.../g seule la première correspondance est remplacée.

Torez, voici la version mise à jour de votre fonction:

$('#title').keyup(function(){ 
    var ref = $(this).val().toLowerCase().replace(/[^a-z0-9]+/g,'-'); 
    $('#reference').val(ref); 
}); 

(. Désolé, Samir, je viens de parler de votre réponse, sauf que je n'ai pas assez de points de réputation encore)

+2

Si vous avez un caractère indésirable au début et/ou à la fin du titre, vous vous retrouverez avec un caractère «-». Avec une ligne de remplacement de texte d'expression régulière supplémentaire comme suit: 'ref = ref.replace (/ (^ - | - $)/g, '');' tout caractère '-' avant ou arrière sera supprimé sortir et rendre l'URL plus propre. – Aryo

0

Je pense que vous voulez une classe de caractères contenant les caractères spéciaux et l'espace, vous pouvez spécifier une ou plusieurs instances de la classe de caractères comme ceci:

[specials charaters " "]+ 

et remplacer qui correspondent à un tiret

1

Vous avez besoin du drapeau global - g - sur la regex, et une sorte de quantificateur pour les multiples (+ = une ou plusieurs correspondances, semble juste ici).

donc quelque chose comme replace(/[' {insert further chars you care about here}]+/g,'-')

+0

Assez vrai, je vais modifier à + – annakata

4

Essayez:

function slug(str) { 
    if (!arguments.callee.re) { 
    // store these around so we can reuse em. 
    arguments.callee.re = [/[^a-z0-9]+/ig, /^-+|-+$/g]; 
    // the first RE matches any sequence of characters not a-z or 0-9, 1 or more 
    // characters, and gets replaced with a '-' the other pattern matches '-' 
    // at the beginning or end of a string and gets replaced with '' 
    } 
    return str.toLowerCase() 
    // replace all non alphanum (1 or more at a time) with '-' 
    .replace(arguments.callee.re[0], '-') 
    // replace any starting or trailing dashes with '' 
    .replace(arguments.callee.re[1],''); 
} 

slug("Kris' FUN new Article "); 
// "kris-fun-new-article" 
0

Comment est-ce?

str = str.toLowerCase().replace(/[^a-z0-9]+/, '-'); 

devrait remplacer tout ce qui est pas une lettre ou un numéro avec un tableau de bord, et le + signifie qu'il faudra plus d'un d'entre eux à la fois.