为什么我不能在/ / g内调用var;

时间:2015-09-01 01:36:37

标签: javascript

我正在使用JavaScript来包含文本框和textarea。按钮调用一个函数来确定文本框中的字符串是否在textarea的内容中找到。当然,如果找到字符串,则向用户发送消息。

这是我的代码:

HTML

<textarea id="textbox3" rows="4" cols="50"></textarea>    
<input id="text3" value="" />
<button id="findTextButton" onclick="findText();">
    #2 Find text from textbox in textarea
</button>

的JavaScript

function findText() {
    var txtThree = document.getElementById("textbox3").value; 
    var searchWord = document.getElementById("text3").innerHTML.value;
    var globalSearch = /[a-z]/g;
    var deliver = txtThree.match(globalSearch);
    if (searchWord === "") {
        alert("Please Enter Text");
    } else {
        alert(deliver);
    }

}

我想要做的是在globalSearch函数中调用变量searchWord,但它不允许我这样做。

2 个答案:

答案 0 :(得分:1)

好吧,我想我得到你想要的东西......你有一个textarea和一个文本输入框。你想从输入框中获取文本并查看textarea中是否有匹配项?

除非您打算做更复杂的事情,否则您不需要RegExp。 .search()可以使用RegExp或String。(在这种情况下,来自&#34; text3&#34;的值)。 你也检查searchWord是否为空早。如果Javascript遇到一个错误,整个事情就会关闭。

function findText() {
    var txtThree = document.getElementById("textbox3").value; 
    //var searchWord = document.getElementById("text3").innerHTML.value;
    //Take away the .innerHTML above
    var searchWord = document.getElementById("text3").value;
    //var globalSearch = /[a-z]/g;
    //You shouldn't need a RegExp.


    if (searchWord === "") {
        alert("Please Enter Text");
    } else {
        var deliver = txtThree.match(searchWord);
        alert(deliver);
    }
}

我对此进行了测试,它对我来说很好。如果这是你所期待的。

我将补充说@UselessCode使用新的RegExp(searchWord)的答案是个好主意。

答案 1 :(得分:0)

在您的代码中,$string = substr(strstr($string,'1037'),4,6); 是一个正则表达式literal,它永远不会改变,并且总会找到相同的东西。表达式globalSearch表示在/[a-z]/ga之间找到一个字符。 z修饰符使其成为global search,这意味着即使在找到第一个匹配项后它也会继续搜索和匹配。

因此,当您运行g时,match将返回包含txtThree.match(globalSearch)中所有字母的单字符字符串数组。例如,如果txtThree包含字符串txtThree,则会返回数组'This is a test.'

您无法使用RegExp文字来搜索不同的内容。但是,一旦您拥有[ "h", "i", "s", "i", "s", "a", "t", "e", "s", "t" ],就可以使用RegExp constructor function生成动态RegExp:

searchWord

您可以将var rxSearch = new RegExp(searchWord); var result = txtThree.match(rxSearch); 修饰符作为第二个参数中的一个标记提供给g,但是因为您只是想确定 字符串是否在那里是的,一旦你找到它就不需要继续搜索。

match要么返回一个匹配数组(在这种情况下为单元素数组,因为我们没有使用RegExp修饰符)或g如果匹配不是找到。自arrays are truthy and nulls are falsey起,我们可以在null语句中使用result来测试是否找到了任何内容:

if

作为Buildersrejected points out,RegEx对于这种情况有点过分。如果我从头开始处理这个问题,我可能会使用indexOf代替:

if (result) {
  alert('Found somthing!');
} else {
  alert('It\'s not there.');
}

在这种情况下,性能并不重要,但如果确实如此,使用if (txtThree.indexOf(searchWord) !== -1) { alert('Found somthing!'); } else { alert('It\'s not there.'); } 会比使用search更快。 indexOf实际上将普通字符串作为参数,indexOf采用正则表达式,如果提供了字符串,则在使用之前将其转换为正则表达式。