我需要在搜索文本周围添加高亮类。但其他html标签是我的方式。这是一个例子:
从:
开始<div class="source">your <b><i>text</i></b> using <a href="#">regex ignoring html</a> tags</div>
我搜索:text using regex
预期结果(在此示例中,我将使用span
突出显示):
<div class="source">your <b><i><span>text</span></i></b><span> using </span><a href="#"><span>regex</span> ignoring html</a> tags</div>
我有解决方案,但它需要特定的正则表达式,搜索忽略内部html标签的文本。 如果有其他解决方案,请在下面提出我的建议。并且它不必用vanilla js 编写。下面是我当前解决方案的简化版本,缺少提到的正则表达式。
由于缺少正则表达式 , 以下示例无法正常工作
在这种情况下,删除html标签不是一种选择。var source = document.querySelector('.source').innerHTML; // html from example
var text = 'text using regex'; // what we searching for
var htmlTag = new RegExp('(<\\/?([a-z]+)([^<]+)*(?:>))+', 'g'); // find html tags
var missingRegExp = new RegExp('', 'i'); // << missing regex
// Wrap searched text with span tag
var result = source.replace(missingRegExp, function (searchedText) {
// Wrap html tags inside searched text with span tag
searchedText = searchedText.replace(htmlTag, function (match) {
return '</span>' + match + '<span>';
});
return '<span>' + searchedText + '</span>';
});
console.log('Result: ' + result);
答案 0 :(得分:-1)
你有一个像text using regex
这样的字符串。您应该关注中间空格并使用适当的RegEx替换它们以匹配HTML标记,但首先您需要将每个单词括在括号中:
> '(' + "text using regex".split(' ').join(') (') + ')'
< "(text) (using) (regex)"
下一步是用RegEx替换空格:((?:\s*(?:<\/?\w[^<>]*>)?\s*)*)
所以我们最后修改的版本应该是:
< "(text)((?:\s*(?:<\/?\w[^<>]*>)?\s*)*)(using)((?:\s*(?:<\/?\w[^<>]*>)?\s*)*)(regex)"
如果我们有3个单词要搜索,那么我们最终会有5个捕获组(n
个单词 - > n
+ n-1
捕获组),所以你应该创建一个替换基于此的字符串。在这里我们应该有我们的替换字符串:
<span>$1</span>$2<span>$3</span>$4<span>$5</span>
现在您已经编译了RegEx版本和替换字符串,.replace()
方法将成功结束它们。
<强> Live demo 强>