2010-05-27 2 views
0

Comment puis-je modifier la mise en surbrillance jquery afin qu'elle ne trouve pas de correspondance apparaissant directement avant ou après un caractère alpha? En d'autres termes, comment puis-je empêcher une correspondance mi-mot?Modifier jQuery Mettre en surbrillance? Javascript Regex

/* 

highlight v3 

Highlights arbitrary terms. 

<http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html> 

MIT license. 

Johann Burkard 
<http://johannburkard.de> 
<mailto:[email protected]> 

*/ 

jQuery.fn.highlight = function(pat) { 
function innerHighlight(node, pat) { 
    var skip = 0; 
    if (node.nodeType == 3) { 
    var pos = node.data.toUpperCase().indexOf(pat); 
    if (pos >= 0) { 
    var spannode = document.createElement('span'); 
    spannode.className = 'highlight'; 
    var middlebit = node.splitText(pos); 
    var endbit = middlebit.splitText(pat.length); 
    var middleclone = middlebit.cloneNode(true); 
    spannode.appendChild(middleclone); 
    middlebit.parentNode.replaceChild(spannode, middlebit); 
    skip = 1; 
    } 
    } 
    else if (node.nodeType == 1 && node.childNodes && !/(script|style)/i.test(node.tagName)) { 
    for (var i = 0; i < node.childNodes.length; ++i) { 
    i += innerHighlight(node.childNodes[i], pat); 
    } 
    } 
    return skip; 
} 
return this.each(function() { 
    innerHighlight(this, pat.toUpperCase()); 
}); 
}; 

jQuery.fn.removeHighlight = function() { 
return this.find("span.highlight").each(function() { 
    this.parentNode.firstChild.nodeName; 
    with (this.parentNode) { 
    replaceChild(this.firstChild, this); 
    normalize(); 
    } 
}).end(); 
}; 

-moi si je me trompe, mais je pense que nous nous concentrons sur les lignes:

var pos = node.data.toUpperCase().indexOf(pat); 

Et:

else if (node.nodeType == 1 && node.childNodes && !/(script|style)/i.test(node.tagName)) { 

Répondre

0

var pos = node.data.toUpperCase().indexOf(pat);

Le indexOf méthode prend une chaîne, et pas une regex, comme son argument. Donc, vous ne pouvez pas rechercher des mots entiers en utilisant cela. Vous pouvez construire une regex à partir de pat et utiliser la méthode String::search() pour rechercher l'occurrence de mot entier.

var reg:RegExp = new RegExp("\\b" + pat + "\\b"); 
var pos = node.data.toUpperCase().search(reg); 

Si vous voulez faire correspondre des mots entiers seulement, l'utilisation limite de mot \b autour des mots.

/\b(script|style)\b/i 
+0

C'est ce que je cherche ... mais êtes-vous sûr que ce n'est pas la ligne. var pos = node.data.toUpperCase() indexOf (pat); – Matrym

+0

@Matrym Voir ma mise à jour – Amarghosh

Questions connexes