$.fn.addHighlight = function(targetText, targetOperator = '='){ function _addHighlight(targetNode, targetText, targetOperator = '='){ var addNodeLength = 0; if(targetNode.nodeType == 3){ switch(true){ case /^=$/.test(targetOperator): var targetRegex = targetText.replace(/[-\/\\^$*+?.()|\[\]{}]/g, '\\$&'); var replaceText = targetNode.textContent.replace(new RegExp('(' + targetRegex + ')', 'g'), '$1'); if(replaceText != targetNode.textContent){ $(targetNode).replaceWith(replaceText); addNodeLength = 2; } break; case /^ILIKE$/i.test(targetOperator): var targetRegex = targetText.replace(/[-\/\\^$*+?.()|\[\]{}]/g, '\\$&').replace(/%/g, '.*').replace(/\\\\\.\*/g, '%').replace(/_/g, '.').replace(/\\\\\./g, '_'); var replaceText = targetNode.textContent.replace(new RegExp('(' + targetRegex + ')', 'gi'), '$1'); if(replaceText != targetNode.textContent){ $(targetNode).replaceWith(replaceText); addNodeLength = 2; } break; case /^[$%a]{2}[-:][$%b]{2}[-:][$%c]{2}$/.test(targetOperator): var targetParts = targetNode.textContent.match(/(\d+)/g); var targetRegex = targetOperator.replace(/\$a/, targetParts[0]).replace(/\$b/, targetParts[1]).replace(/\$c/, targetParts[2]).replace(/%%/, '\\d+'); var replaceText = targetNode.textContent.replace(new RegExp('(' + targetRegex + ')', 'gi'), '$1'); if(replaceText != targetNode.textContent){ $(targetNode).replaceWith(replaceText); addNodeLength = 2; } break; case /^[<>]=?$/.test(targetOperator): var targetValue = targetNode.textContent.trim(); var replaceText; switch(targetOperator){ case '<': if(targetValue < targetText) replaceText = targetNode.textContent.replace(new RegExp('(' + targetValue + ')', 'gi'), '$1'); break; case '>': if(targetValue > targetText) replaceText = targetNode.textContent.replace(new RegExp('(' + targetValue + ')', 'gi'), '$1'); break; case '<=': if(targetValue <= targetText) replaceText = targetNode.textContent.replace(new RegExp('(' + targetValue + ')', 'gi'), '$1'); break; case '>=': if(targetValue >= targetText) replaceText = targetNode.textContent.replace(new RegExp('(' + targetValue + ')', 'gi'), '$1'); break; } if(replaceText != targetNode.textContent){ $(targetNode).replaceWith(replaceText); addNodeLength = 2; } break; } } else if(targetNode.nodeType == 1 && targetNode.childNodes && !/(script|style)/i.test(targetNode.tagName)){ for(var i = 0; i < targetNode.childNodes.length; i++){ i += _addHighlight(targetNode.childNodes[i], targetText, targetOperator); } } return addNodeLength; } return this.length && targetText && targetText.length ? this.each(function(){ _addHighlight(this, targetText, targetOperator); }) : this; } $.fn.removeHighlight = function(){ return this.find('span.highlight').each(function(){ $(this).contents().unwrap(); }).end(); };