用javascript替换子字符串,但如果是在标记之间或标记内,则不替换
所以我在这里写了这段代码:用javascript替换子字符串,但如果是在标记之间或标记内,则不替换,javascript,html,regex,parsing,replace,Javascript,Html,Regex,Parsing,Replace,所以我在这里写了这段代码: highlighter: function (item) { var parts = this.query.split(" "); var length = parts.length; for (var i = 0; i < length; i++){ if(parts[i] != ""){ item = item.replace(new RegExp('(' + parts[i] + ')', '
highlighter: function (item) {
var parts = this.query.split(" ");
var length = parts.length;
for (var i = 0; i < length; i++){
if(parts[i] != ""){
item = item.replace(new RegExp('(' + parts[i] + ')', 'ig'), function ($1, match) {
return '<strong>' + match + '</strong>'
})
}
}
return item;
}
及
我想要这个是一些文本
这非常有效,除非我在
元素本身中找到匹配项。因此,我只希望替换不在strong
标记本身中的匹配项。因为我得到的结果字符串中有ong>
或trong>
。这是可能的吗?要只搜索标记之外的内容,您需要一个解析器,它可以过滤掉所有HTML标记,并在标记之间只显示可以搜索的文本片段。我不知道您的特定应用程序是如何工作的,但通常获得解析器的最佳方法是让浏览器为您解析HTML,并仅在标记之间的结果文本节点上进行搜索。如果您想避免使用强标记,请一步完成替换:
item = item.replace(
new RegExp(parts.join('|'), 'ig'),
function (match) {
return '<strong>' + match + '</strong>'
}
)
item=item.replace(
新的RegExp(parts.join(“|”),“ig”),
功能(匹配){
返回“”+匹配+””
}
)
如果在开始之前“item”包含strong,您仍然会遇到问题,否则您不会有问题
编辑:
假设你想匹配“这个”、“那个”和“另一个”。一个正则表达式,或RegExp
,它是This | some | other
。奇怪的是,传递给newregexp
的字符串被解析为一个正则表达式
另一个需要注意的重要事项是item.replace(regex,callback)
将用调用callback(match,…)
的结果替换找到的每个匹配项。传递给回调函数的第一个参数是正则表达式的整个匹配项,而其余参数是匹配项中的组
如果您想了解更多信息,请阅读正则表达式。因为在这些语言中没有本机的反向查找,如果您想在替换时忽略标记,则需要匹配它们并用它们自己替换,如下所示:
item = item.replace(
new RegExp(
"(<\\/?\\w+(\\s+\\w+(\\s*=\\s*(\"[^\"]*\"|'[^']*'|\\S+))?)*>)"
+ "|(" + parts.join("|") + ")",
"ig"),
function (match, tag, p2, p3, attributeValue, matchedText) {
if (tag)
{
return tag;
}
return "<strong>" + matchedText + "<\/strong>";
});
item=item.replace(
新正则表达式(
“(我使用的解决方案!:
highlighter: function (item) {
var parts = this.query.replace(/\s+/g, " ").replace(/^\s|\s$/g,"").split(/\s/);
if( item.match(/(?:&[^;]*;)+/) != null){
item = strip(item);
}
item = item.replace(
new RegExp('(' + parts.join('|') + ')', 'ig'),
function (_, match) {
return '<strong>' + match + '</strong>'
}
)
return item;
}
然后我做了替换部分,我使用了Eric的代码
非常感谢!
我对regex也有了更好的了解!注意,前两行可以而且应该合并成一行:var parts=this.query.split(“”)
。构建一个数组只是立即丢弃它是没有意义的。是的,这似乎很明显。我不知道为什么我没有这样做,谢谢!效果很好!你能解释一下你的答案吗?它在所有子字符串之间放置了一个|,这会导致用强等价物替换它们,但是|实际上意味着什么?它是什么参数(u,匹配)?我认为u可能是一个通配符。但为什么它必须是一个通配符。为什么它会提供所有匹配项。\uuu
没有特殊意义。它是一个参数名,通常用于未使用的参数。@gl3nn只有在项中没有标记且要突出显示的单词有标记时,它才能可靠地工作不包含RegExp
-特殊字符。对于所有其他情况,请参阅我的解决方案。由于项目只是名称,因此此解决方案工作正常。从我有足够声誉的那一刻起,我将投票支持两个答案。另一个问题是。é;。如果将eac用作查询字符串,eac将变强,$eacute;不再变为é。而且我无法使用é在é;上搜索。我也找不到针对javascript进行编码和解码的htmlentities…我正在用一个额外的问题更新我的问题。考虑innerHTML
,这是一个不错的选择,但请记住,它仍然是一个专有属性,容易出错,与使用现有文本节点值相比,重新解析效率相当低我已经做了一些性能优化。什么样的优化?请随时告诉我:D
item = item.replace(
new RegExp(
"(<\\/?\\w+(\\s+\\w+(\\s*=\\s*(\"[^\"]*\"|'[^']*'|\\S+))?)*>)"
+ "|(" + parts.join("|") + ")",
"ig"),
function (match, tag, p2, p3, attributeValue, matchedText) {
if (tag)
{
return tag;
}
return "<strong>" + matchedText + "<\/strong>";
});
highlighter: function (item) {
var parts = this.query.replace(/\s+/g, " ").replace(/^\s|\s$/g,"").split(/\s/);
if( item.match(/(?:&[^;]*;)+/) != null){
item = strip(item);
}
item = item.replace(
new RegExp('(' + parts.join('|') + ')', 'ig'),
function (_, match) {
return '<strong>' + match + '</strong>'
}
)
return item;
}
function strip(html)
{
var tmp = document.createElement("DIV");
tmp.innerHTML = html;
return tmp.textContent||tmp.innerText;
}