2009-08-04 6 views
7

Étant donné une aiguille et une botte de foin ... Je veux mettre des étiquettes audacieuses autour de l'aiguille. Alors, quelle expression regex utiliserais-je avec replace()? Je veux ESPACE être le délimiteur et je veux que la recherche soit insensible à la casseJavascript Regex: Comment mettre en gras des mots spécifiques avec regex?

donc dire que l'aiguille est « vache » et la botte de foin est

cows at www.cows.com, milk some COWS 

se transformerait en

<b>cows</b> at www.cows.com, milk some <b>COWS</b> 

aussi mots-clés devraient être en mesure d'avoir des espaces dedans si le mot-clé est "qui est mgmt" ...

great band. who is mgmt btw? 

se transformer en

great band. <b>who is mgmt</b> btw? 

Merci

Répondre

12

Voici une regex pour faire ce que vous cherchez:

(^|\s)(cows)(\s|$) 

En JS, le remplacement est comme ceci:

myString.replace(/(^|\s)(cows)(\s|$)/ig, '$1<b>$2</b>$3'); 

enveloppé avec soin dans une fonction réutilisable:

function updateHaystack(input, needle) { 
    return input.replace(new RegExp('(^|\\s)(' + needle + ')(\\s|$)','ig'), '$1<b>$2</b>$3'); 
} 

var markup = document.getElementById('somediv').innerHTML; 
var output = updateHaystack(markup, 'cows'); 
document.getElementById('somediv').innerHTML = output; 
+0

+1 pour prendre ma réponse éventuelle un peu plus loin . :) – Amber

+0

Y at-il une faute de frappe? boldKeywords fonction (mots-clés, botte de foin) { \t for (var c = 0; c $ 2 $ 3'); \t} \t retour haystack; } pour quelque raison que ce code ne gras rien. merci – rawrrrrrrrr

+0

updateHaystack ('vaches chez www.cows.com, traitez quelques vaches,' vaches '); ne met rien en gras, mais updateHaystack ('vaches sur www.cows.com, traire quelques vaches, 'vache'); change de vache à vache s – rawrrrrrrrr

1
findstring: /(^|\s)(cows)(\s|$)/ig 
newstring: '$1<b>$2</b>$3' 

Les marqueurs \ b sont des "limites de mots"; les drapeaux/ig sont respectivement pour la casse et la correspondance globale.

L'utilisation des captures(), puis $ 1/$ 2/$ 3 dans le nouveau texte de chaîne est de sorte que la capitalisation et l'espacement de tout ce qui a été apparié seront conservés.

-1
var needle = 'cows'; 

var regexp = new RegExp('(^|\s)('+needle+')(\s|$)', 'ig'); 

var old_string = 'cows at www.cows.com, milk some COWs'; 

var new_string = old_string.replace(regexp, '<b>$1$2$3</b>'); 
+0

Votre exemple ne fonctionnera pas, car il nécessite un espace à la fois pour précéder et suivre l'aiguille, ce qui n'est le cas pour aucune des occurrences de «vaches» dans votre old_string. – Amber

+0

Il a dit qu'il voulait l'espace comme délimiteur. Pour le faire fonctionner avec le début et la fin des chaînes, il pourrait être '(^ | \ s)' + needle + '(\ s | $)' non testé mais je pense que cela devrait fonctionner –

9

Pour ceux qui ne veulent pas t ESPACE comme délimiteur, n'utilisez simplement pas \s.

function updateHaystack(input, needle) 
{ 
return input.replace(new RegExp('(^|)(' + needle + ')(|$)','ig'), '$1<b>$2</b>$3'); 
} 

J'ai travaillé pour moi.