2010-02-06 6 views
3

J'ai une chaîne de balises délimitées par des points-virgules:Javascript chaîne Remplacer

"red; yellow; blue; green; purple" 

Je voudrais enlever toutes les balises qui ne correspondent pas à une sous-chaîne

Par exemple (insensible à la casse.) , si j'ai une sous-chaîne "Bl" je voudrais retourner "bleu".

Avez-vous des suggestions pour réaliser ceci en javascript? Plus précisément, je me demande s'il existe une méthode en une seule étape pour ce faire dans regex ...

Merci d'avance!

+0

Quel devrait être le type de retour? Une chaîne délimitée par des points-virgules ou un tableau? –

+0

Désolé, j'aurais dû préciser. Une autre chaîne délimitée par un point-virgule, merci. – Travis

Répondre

1

Vous pouvez utiliser quelque chose comme ceci:

var needle = 'blu'; 
var s = 'red; yellow; blue; geen; purple'; 
var a = s.split('; '); 
var newArray = new Array(); 
for (var i = 0; i < a.length; i++) { 
    if (a[i].indexOf(needle) != -1) { 
     newArray.push(a[i]); 
    } 
} 
var result = newArray.join('; '); 
alert(result); 

La méthode est essentiellement comme Simon décrit, avec une étape supplémentaire - un join à la fin de convertir le résultat en une chaîne.

Juste pour le plaisir, voici une solution basée sur regex fou. Attention: si votre terme de recherche contient des caractères spéciaux, ils devront être échappés. Je suppose que le terme de recherche ne contiendra que des caractères non spéciaux:

var s = 'red; yellow; blue; geen; purple'; 
var result = ('; ' + s).replace(/;(?![^;]*blu)[^;]*(?=;|$)/g, '').substring(2); 
alert(result); 
+0

+1 me battre à la version regexp bien que j'ai utilisé une fonction comme la chaîne de remplacement qui a copié les correspondances à une autre chaîne .. –

+0

C'est en effet une regex folle. :) Merci pour la bonne réponse! – Travis

+0

Je crois que l'expression rationnelle pourrait être simplifiée en: '(^ | \ b) \ w * blu \ w * (; | $)' –

2

Commencez par analyser la chaîne dans un tableau à l'aide de split(), puis passez en revue la matrice et recherchez les correspondances en utilisant match ou indexOf sur les éléments de la matrice. Si vous voulez ne pas tenir compte de la casse, vous pouvez soit utiliser une expression rationnelle insensible à la casse, soit faire toLowerCase sur tous les éléments comparés.

+0

Merci Simon. Je fais quelque chose de similaire à ça maintenant. Je suppose que j'espérais qu'il y aurait un moyen magique de le faire en regex. :) – Travis

+0

+1 parce que cela décrit essentiellement ce que je viens de mettre en œuvre. –

+0

@travis: Si vous voulez vraiment un reflex surréaliste fou, voir ma réponse - J'ai ajouté une méthode qui utilise regex. ;-) –

0
function find_substring(tags, search){ 
var tags_array = tags.split(";"); 
var found_tags = []; 
for(var i=0; i<tags_array.length; i++){ 
    if(tags_array[i].indexOf(search) > -1){ 
    found_tags.push(tags_array[i]); 
    } 
} 
if(found_tags.length > 0){ 
    return found_tags.join("; "); 
}else{ 
    return false; 
} 
} 

var tags = "red; yellow; blue; geen; purple"; 
var search = "blue"; 
find_substring(tags,search); 
+0

Euh, je ne pense pas que vous voulez que votre boucle for retourne juste l'élément tag. Ne voulez-vous pas créer une nouvelle liste de tags, et renvoyer cela? – Pointy

+0

bon point ... corrigé –