根据起始位置和结束位置突出显示字符串中的子字符串

时间:2014-11-10 07:58:02

标签: javascript jquery html css

给定一个String作为输入。假设"风扇叶片的前叶片边缘凸出" 。 单击按钮会将字符串传递给服务器,服务器将返回JSON对象

{
  "result": [
    {
      "name": "blade",
      "startPos": 12,
      "endPos": 17

    },
    {
      "name": "bulged",
      "startPos": 44,
      "endPos": 50 
    }
  ]
}

现在我要强调两个词' blade' '凸起的'在输入字符串中并将它们显示为输出。

输入:"风扇叶片的前叶片边缘凸出"

预期输出:风扇叶片的前导刀片边缘凸起

我总能匹配单词并使用正则表达式突出显示它们,但它会突出显示“刀片”和“刀片”的出现。在输入字符串中。

JavaScript中是否有任何方法可以根据位置识别字符串并突出显示它们。

非常感谢您的帮助。

我们Fiddle

2 个答案:

答案 0 :(得分:0)

使用JS字符串方法substring查找字符串的相关部分。在这种情况下,由于您必须为突出显示添加标记,因此您希望在目标词之前和之后找到子字符串。

然后使用<strong>或类似内容添加突出显示。见下面的例子。

您需要遍历obj.result,同时考虑添加<strong>等标记会改变后续单词的起始索引这一事实。您可以考虑从字符串末尾附近的单词开始突出显示,以避免索引的复杂性。为此,请按startPos的降序对列表进行排序,如下所示。

&#13;
&#13;
var str = "the leading blade edges of the fan blade is bulged";
var obj = {
  "result": [{
    "name": "blade",
    "startPos": 12,
    "endPos": 17

  }, {
    "name": "bulged",
    "startPos": 44,
    "endPos": 50
  }]
};
obj.result.sort(function(a, b) {
  return b.startPos - a.startPos;
})

for (var i = 0; i < obj.result.length; i++) {
  var start = obj.result[i].startPos,
    end = obj.result[i].endPos,
    before = str.substring(0, start),
    after = str.substring(end),
    middle = "<strong>" + obj.result[i].name + "</strong>";

  str = before + middle + after;
}


document.getElementById("result").innerHTML = str;
&#13;
<div id="result"></div>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

我知道你在寻找什么可能是一种更具结构性的方法,但我想最好的镜头将是如下:

var str = "the leading blade edges of the fan blade is bulged";
for(var loc in obj.result){
    str = str.substring(0,obj.result[loc].startPos+loc*17) + "<strong>" +
      str.substring(obj.result[loc].startPos+loc*17,obj.result[loc].endPos+loc*17) + "</strong>" +
      str.substring(obj.result[loc].endPos+loc*17);
}