Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.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_Ajax_String_Match - Fatal编程技术网

Javascript 返回搜索到的字符串+;上下一个词

Javascript 返回搜索到的字符串+;上下一个词,javascript,ajax,string,match,Javascript,Ajax,String,Match,我有这样一个字符串: 这是我的文本 当我搜索像is这样的字符串时,我想得到这是我的作为结果,当我搜索这时,我想得到这是而对于文本结果应该是我的文本 因此,我总是试图找到一个字符串,并获得搜索的字符串+上一个和下一个单词(如果存在) 我知道我可以用mystring.match('search')搜索字符串,给我索引,但我如何进一步,也许可以使用split 也许你们中的某个人有个想法 谢谢你的帮助 鲁文试试这个 这里有工作 代码是用javascript编写的 var str = "This is m

我有这样一个字符串:
这是我的文本

当我搜索像
is
这样的字符串时,我想得到
这是我的
作为结果,当我搜索
时,我想得到
这是
而对于
文本
结果应该是
我的文本

因此,我总是试图找到一个字符串,并获得搜索的字符串+上一个和下一个单词(如果存在)

我知道我可以用
mystring.match('search')
搜索字符串,给我索引,但我如何进一步,也许可以使用
split

也许你们中的某个人有个想法

谢谢你的帮助

鲁文

试试这个

这里有工作

代码是用javascript编写的

var str = "This is my text";

var strArr = str.split(" ");

var seacrhWord = "is";

for (i=0; i<strArr.length; i++)
   {
      if ( strArr[i] == seacrhWord)
      {
          var result = "";
          if (strArr[i-1] != null)
             result += strArr[i-1]

          result += " " + strArr[i];

          if (strArr[i+1] != null)
             result += " " + strArr[i+1];

          alert(result);
      }
  }
var str=“这是我的文本”;
var strArr=str.split(“”);
var seacrhWord=“is”;
对于(i=0;i在我看来,对于“this i”等,可以使用regex,3或4大小写
对于以^this开头的搜索?但如果不小心,此搜索是不健康的。空格和不匹配的词可能会造成难以匹配的问题
此i*.for子字符串匹配(/yoursearchterm/[A-Za-z0-9_-]*/i)
如果不匹配,则使用搜索词的子字符串,如
yoursearchterm.substring(0,yoursearchterm.length-1)
在for循环中,尝试使用-1到-i表示相似性

sql中的全文搜索或类似表达式。 为了获得更好的结果,sql正则表达式可能会帮助您,但它们都是{like and Regex not fast} 喜欢 苹果是你的数据 appla或app或appl或eppl是您搜索它们的工具 你可以让他们通过 php中的levenstein 对于子字符串或长字符串,可以使用 按空间拆分{或分解}数据 .我在这儿 你的数据分成了3部分 我来了 两者都可以应用lev或类似regex
匹配成功,但您必须考虑查询的性能。我建议使用以下方法,它使用函数式方法,允许您传递要搜索的单词和要在其中搜索该单词的字符串:

function findWordAndNeighbours(needle, haystack) {
    if (!needle || !haystack) {
        return false;
    }
    else {
        var re = new RegExp('(\\S+[\\b\\s]' + needle + '[\\b\\s]\\S+)', 'i'),
            foundWords = haystack.match(re)[0].split(/\s+/),
            foundFragment = foundWords.join(' ');
        return foundFragment;
    }
}

var sentenceFragment = findWordAndNeighbours('test', 'This is a Test of a matching thing.');

console.log(sentenceFragment);

编辑以更新上述内容,包括一些错误捕获,基本上是在尝试处理这些匹配之前检查是否存在一些正则表达式匹配:

function findWordAndNeighbours(needle, haystack) {
    if (!needle || !haystack) {
        return false;
    }
    else {
        var re = new RegExp('(\\S+[\\b\\s]' + needle + '[\\b\\s]\\S+)', 'i'),
            matches = haystack.match(re);
        if (matches) {
            // this is for if you wanted the individual words (as an array)
            var foundWords = haystack.match(re)[0].split(/\s+/),
                // this is to return the found sentence-fragment:
                foundFragment = foundWords.join(' ');
            return foundFragment;
        }
        else {
            /* this just follows the indexOf() pattern of, if you'd rather
               'return false' instead, that's entirely your call. */
            return -1;
        }
    }
}

var sentenceFragment = findWordAndNeighbours('test', 'This is a Test of a matching thing.');

console.log(sentenceFragment);

编辑以纠正OP在评论(如下)中发现的问题:


但是如果你搜索这个或东西,这将不起作用,所以第一个或最后一个词

使用
操作数/特殊字符(意思是匹配前面的字符/组零或组一的次数)似乎可以解决搜索所提供字符串中的第一个和最后一个单词时出现的问题

function findWordAndNeighbours(needle, haystack) {
    if (!needle || !haystack) {
        return false;
    }
    else {
        var re = new RegExp('((\\S+[\\b\\s]?)' + needle + '([\\b\\s]?\\S+))', 'i'),
            matches = haystack.match(re);
        console.log(matches);
        if (matches) {
            var foundWords = haystack.match(re)[0].split(/\s+/),
                foundFragment = foundWords.join(' ');
            return foundFragment;
        }
        else {
            return -1;
        }
    }
}

var sentenceFragment = findWordAndNeighbours('es', 'This is a Test of a matching thing.');

console.log(sentenceFragment);
但是,我无法找到一种从给定单词中搜索子字符串的简洁方法,例如
es
(如示例中所示,来自
test
)。该函数返回完整的单词(在本例中为
test
)。如果您希望对该行为进行简单的更正,则可以轻松地添加
If(needle==matches[0]){/*做点什么*/}
检查,并按照您认为最好的方式改变行为。但我不完全确定处理这种情况的最佳方式是什么

参考资料:

另一种解决方案:

var input = 'Text? This is my simple text string where I use word TEXT a few times. Is it finding my text?'
var text = 'text';

input = input.toString();
text = text.toString().replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');

var preLength = 7;

var search = function () {
    if (position !== -1) {
        var sliceStart = (position - preLength) >= 0 ? position - preLength : 0;
        var sliceEnd = position + text.length + preLength;

        var matchedText = input.slice(sliceStart, sliceEnd).trim();

        var preText = ((position - preLength) >= 0) && !result.length ? '...' : '';
        var postText = input.slice(sliceEnd).trim().length > 0 ? '...' : '';

        result = result + preText + matchedText + postText;

        input = input.slice(sliceEnd);
        lowercaseInput = lowercaseInput.slice(sliceEnd);

        position = lowercaseInput.search(lowercaseText);
    }
}

var lowercaseInput = input.toLowerCase();
var lowercaseText = text.toLowerCase();

var result = '';
var position = lowercaseInput.search(lowercaseText);

while (position !== -1) {
    search();
}

console.log(result);
这将查找搜索的文本并返回一个包含所有匹配项的结果


应该发生什么:
“…句子结束。新句子开始。”
如果你搜索单词
开始
?结果应该是
句子。开始
因为这不是搜索全文,只是搜索标题。啊,很酷,我理解这个解决方案。谢谢。但它不是有点慢吗?我想不是因为我只搜索数组的值。但这只适用于相同的单词和我t不区分大小写。当你搜索
tex
时,它将不起作用。我使用
if(strArr[i]==seacrhWord)
而不是
if(strArr[i].indexOf(seacrhWord)>=0)
这样我就可以搜索wordparts了。这符合你的需要!很好的解决方案!我很高兴能帮助你:)对不起,你在搜索什么词?我想我的javascript知识不是很好,所以我不理解这个解决方案。也许你可以解释一下?这个答案寻找空白(
\s
),然后是一组零或更多(
*
)字母数字字符(
\w
)另一个空格然后文字
然后是一个空格和零个或多个字母数字字符,然后在组后面是另一个空格。
[1]
意味着使用
匹配()返回的第二个数组
method。但是如果你搜索这个或东西,这将不起作用,所以第一个或最后一个词。但是我成功了。哦!我知道我的待办事项列表上还有一些东西!叹气……但我很高兴你成功了!希望我的答案对你有所帮助!=)嗯,我尝试扩展你的答案,但当我要搜索第一个和最后一个时,我总是得到-1分。此外,当我尝试搜索例如
tes
(不是完整的单词)时,我会得到一个匹配事物的
测试。
当我通过
*
扩展您的regexp时。一个如何改变它,使其正确工作的想法?希望编辑后的答案(最后的代码块)对您有更好的用处。=)
var input = 'Text? This is my simple text string where I use word TEXT a few times. Is it finding my text?'
var text = 'text';

input = input.toString();
text = text.toString().replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');

var preLength = 7;

var search = function () {
    if (position !== -1) {
        var sliceStart = (position - preLength) >= 0 ? position - preLength : 0;
        var sliceEnd = position + text.length + preLength;

        var matchedText = input.slice(sliceStart, sliceEnd).trim();

        var preText = ((position - preLength) >= 0) && !result.length ? '...' : '';
        var postText = input.slice(sliceEnd).trim().length > 0 ? '...' : '';

        result = result + preText + matchedText + postText;

        input = input.slice(sliceEnd);
        lowercaseInput = lowercaseInput.slice(sliceEnd);

        position = lowercaseInput.search(lowercaseText);
    }
}

var lowercaseInput = input.toLowerCase();
var lowercaseText = text.toLowerCase();

var result = '';
var position = lowercaseInput.search(lowercaseText);

while (position !== -1) {
    search();
}

console.log(result);