Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用javascript替换子字符串,但如果是在标记之间或标记内,则不替换_Javascript_Html_Regex_Parsing_Replace - Fatal编程技术网

用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;
}