2013-04-25 3 views
1

Я определенно новичок и пробую практический проект. Его в основном анаграмма игра, где пользователь нажимает на определенные буквы, чтобы собрать слово. Теперь мне нужно проверить, что это на самом деле слово. Я сделал текстовый файл, содержащий все слова в словаре (скопированный с веб-сайта someones в качестве своего практического проекта). Мне удалось это сделать, чтобы я мог console.log слова.Javascript/JQuery Поиск, если слово существует в строке

function Searchtext(){ 
    $.get('words.txt', function(data) { 
console.log(data); 



}, 'text'); 
    } 

Теперь я хочу, чтобы найти слова, чтобы увидеть, если ответ игрока (строка, которая объявлена ​​в переменной под названием playeranswer) находится в списке. Мне не нужно, чтобы оно возвращало слово, только если оно есть или нет. Нотабене это должно быть точным, так что, например, если пользователь ввел «ender», который не является словом, он не вернется к истине, потому что находит слово «render». Может быть, что-то с .length поможет?

Как бы я это сделал?

Спасибо за любую помощь.

+3

заказ RegExp –

+0

[Regex Docs] (https: //developer.mozilla.org/en-US/docs/JavaScript/Guide/Regular_Expressions) для справки. – ajp15243

+0

Вы пытаетесь выполнить вызов сервера каждый раз, когда пользователь пытается проверить это слово? Почему бы просто не поместить все слова в переменную javascript на первое место? У вас есть серверный язык программирования? если да, то почему бы не проверить на стороне сервера и вернуть true/false? – Ejaz

ответ

3

Поскольку $.get является асинхронный, вам придется настроить его по-другому. Я хотел бы сделать это:

function Searchtext(name, callback) { 
    $.get('words.txt', function(data) { 
     data = data.split("\n"); 
     var contains = (data.indexOf(name) > -1); 
     callback(contains); 
    }, 'text'); 
} 

В зависимости от того, как текстовый файл настроек, вы, возможно, придется изменить .split("\n") (который разбивает слова в массив, если они каждый на линии), чтобы .split(" ") (который разбивает слова на массив, если они разделены пробелом).

И вы называете это нравится:

DEMO:http://jsfiddle.net/Fkr5B/

В демо, я должен был имитировать запрос AJAX.

+0

Что делать, если за словом следует запятая? – sgroves

+0

@sgroves Nope. 'data' - это массив, поэтому значение, используемое в' indexOf', должно точно соответствовать элементу массива. – Ian

+0

@sgroves Информация о формате текстового файла от OP очень мало. Я предполагаю, что. Так что да, есть несколько вариантов, несколько вещей, которые нужно сделать в разных сценариях. – Ian

0

Вы должны сначала разобрать переменную data и поместить слова в Array. Затем вы можете проверить, введен ли пользователь действительное слово, проверив, содержит ли ваше Array это слово.

var Dict = new Array("render", "bender", "word"); 

function isValid(word){ 
    if(Dict.indexOf(word) == -1) 
     return false; //the word is not valid 
    return true; //the word is valid 
}  
+0

'return (! (Dict.indexOf (word) == -1));' –

+0

или 'return Dict.indexOf (word)> -1' – Ejaz

0

Ваш лучший выбор - регулярные выражения. Что вы можете сделать, это принять строку, введенную пользователем, оберните его с граничным указанием слова (так он будет совпадать с точным словом и ничего) в регулярном выражении, а затем использовать спичку()

2

Я бы использовал регулярное выражение (используя объект RegExp) для этого. Вот простой пример, который пытается сопоставить слово в двух разных строках слов:

var word_to_match = 'ender'; 
var string_of_words = 'a string containing the word ender, this will match'; 
var second_string_of_words = 'a string that will not produce a match'; 

//use \b to match on word boundaries 
var filter = new RegExp('\\b' + word_to_match + '\\b', 'gi'); 

if(string_of_words.match(filter)) { 
    alert('found word: ' + word_to_match); 
} else { 
    alert('did not find word: ' + word_to_match); 
} 

if(second_string_of_words.match(filter)) { 
    alert('found word: ' + word_to_match); 
} else { 
    alert('did not find word: ' + word_to_match); 
} 

Вы увидите первое if заявления проходит, а второй выходит из строя. Может потребоваться небольшое чтение, но вы сможете расширить этот пример, чтобы он соответствовал вашему варианту использования.

+0

спасибо, я использовал '\\ b' + playeranswer + '\\ b', 'gi', и он отлично работал! – Truvia

0

Я сделал этот простой сценарий, надеюсь, что это помогает

$(document).ready(function(e) { 
    function parseData(data) { 
    $('#inpu').blur(function() { 
     var str_to_search = $.trim($('#inpu').val()); 
     if(str_to_search.length) { 
      var search_res = data.search(str_to_search); 
      if(search_res != -1) { 
       alert('Word Valid!'); 
      } else { 
       alert('Word no valid'); 
      } 
     } 
    }); 
} 
$.get('to_search.txt', parseData).fail(function() { alert('error');}); 
}); 
Смежные вопросы