使用javascript查找搜索字词(代码段)周围的字词

时间:2013-04-23 01:45:27

标签: javascript regex

我正在使用jlinq从某些json返回搜索结果,我想向用户显示结果文本的片段,其中包含搜索词,比如搜索词之前的三个词和之后的三个词

var searchTerm = 'rain'
var text = "I'm singing in the rain, just singing in the rain";

结果就像“在雨中唱歌,只是唱歌”

我怎么能在javascript中这样做?我见过一些suggestions using php,但没有专门针对javascript。

2 个答案:

答案 0 :(得分:4)

这是一个稍好的近似值:

function getMatch(string, term)
{
    index = string.indexOf(term)
    if(index >= 0)
    {
        var _ws = [" ","\t"]

        var whitespace = 0
        var rightLimit = 0
        var leftLimit = 0

        // right trim index
        for(rightLimit = index + term.length; whitespace < 4; rightLimit++)
        {
            if(rightLimit >= string.length){break}
            if(_ws.indexOf(string.charAt(rightLimit)) >= 0){whitespace += 1}
        }

        whitespace = 0
        // left trim index
        for(leftLimit = index; whitespace < 4; leftLimit--)
        {
            if(leftLimit < 0){break}
            if(_ws.indexOf(string.charAt(leftLimit)) >= 0){whitespace += 1}
        }
        return string.substr(leftLimit + 1, rightLimit) // return match
    }
    return // return nothing
}

这有点“贪婪”嘿嘿但它应该做的伎俩。注意_ws数组。您可以包含您喜欢或修改的所有空白区域以使用正则表达式来检查空格。

对此进行了略微修改以处理短语。它只找到该术语的第一次出现。处理多次事件需要稍微不同的策略。

在我看来,你想要的东西(在不同程度上)也可能具有以下内容:

function snippet(stringToSearch, phrase)
{
    var regExp = eval("/(\\S+\\s){0,3}\\S*" + phrase + "\\S*(\\s\\S+){0,3}/g")
    // returns an array containing all matches
    return stringToSearch.match(regExp)
}  

唯一可能的问题是,当它抓取你的模式的第一次出现时,它会切掉匹配的部分,然后再次搜索。您还需要注意“短语”变量中没有任何regExp字符(或将其转换为十六进制或八进制表示)

无论如何,我希望这有助于男人! :)

答案 1 :(得分:2)

首先,我们需要在字符串中找到第一次出现的术语。 相反,我们处理一个单词数组,所以我们最好在这样的数组中找到一个术语的首次出现。 我决定将此方法附加到Array的原型。 我们可以使用indexOf,但如果我们将字符串拆分为“”,我们将处理“rain”之类的字词,而indexOf则不会与之匹配。

Array.prototype.firstOccurance = function(term) { 
    for (i in this) { 
        if (this[i].indexOf(term) != -1 ) {  // still can use idnexOf on a string, right? :)
            return parseInt(i,10);  // we need an integer, not a string as i is
        }
    }
}

然后,我按字词分割一个字符串,这样做,用“”分开:

function getExcerpt(text, searchTerm, precision) {
    var words = text.split(" "),
        index = words.firstOccurance(searchTerm),
        result = [], // resulting array that we will join back
        startIndex, stopIndex;
    // now we need first <precision> words before and after searchTerm
    // we can use slice for this matter
    // but we need to know what is our startIndex and stopIndex
    // since simple substitution from index could lead us to 
    // a negative value
    // and adding to an index could get us to exceeding words array length

    startIndex = index - precision;
    if (startIndex < 0) {
        startIndex = 0;
    }

    stopIndex = index + precision + 1;
    if (stopIndex > words.length) {
        stopIndex = words.length;
    }


    result = result.concat( words.slice(startIndex, index) );
    result = result.concat( words.slice(index, stopIndex) );
    return result.join(' '); // join back
}

结果:

> getExcerpt("I'm singing in the rain, just singing in the rain", 'rain', 3)
'singing in the rain, just singing in'


> getExcerpt("I'm singing in the rain, just singing in the rain", 'rain', 2)
'in the rain, just singing'


> getExcerpt("I'm singing in the rain, just singing in the rain", 'rain', 10)
'I\'m singing in the rain, just singing in the rain'