Запуск уравнения с Javascript из текстового поля

Я пытаюсь создать простой онлайн-калькулятор, который может выполнять основные вычисления в Javascript.

Мне удалось создать интерфейс так, чтобы числа и операторы сохранялись и в поле формы.

То, что я хотел бы сделать, это передать значения в поле формы функции, которая будет вычислять сумму поля формы.

Поле формы может содержать что угодно, от простых 10 + 10 до более сложных уравнений с использованием скобок. Используемые операторы + - * /

Можно ли передать поле формы в функцию JavaScript, которая может распознавать операторы и выполнять функцию операции над значениями.

Возможное значение в текстовом поле будет:

120/4+130/5

Функция должна затем вернуть 56 в качестве ответа. Я сделал это в JavaScript, когда я знаю значения, как в этой скрипкеhttp://jsfiddle.net/DhqGB/

То, что я хотел бы сделать, это передать полное значение "120/4 + 130/5". к функции, и он сможет извлечь числа и операторы для создания общей суммы.

У кого-нибудь есть идеи о том, как это можно сделать или вообще возможно? это может стать более сложным, когда мне может понадобиться передать значения в скобках «(120/4) + (130/5)»

 Aren01 июн. 2012 г., 23:44
Что бы ты ни делал, держись подальше отeval
 MaxArt01 июн. 2012 г., 23:52
@ Арен Почему? Есть много проблем сeval, но пока ввод безопасен, нет сомнений, что это самый быстрый анализатор формул для разработчиков Javascript. Я не вижу смысла притворяться, что его даже не существует.
 Juan Mendes02 июн. 2012 г., 00:12
@ Aren Вы можете передать ввод для запуска внутри iframe в другом домене.
 Juan Mendes01 июн. 2012 г., 23:54
Вы можете использоватьeval, если вы запускаете его из iframe в домене, который предназначен только для этой цели и не может получить доступ к своему собственному домену.
 Aren02 июн. 2012 г., 00:06
Его ввод - это ввод текста, ему придется проверять ввод, а это значит, что он в значительной степени выполняет всю работу по разбору ввода на вычислимые компоненты, почему бы просто не сохранить угрозу безопасности и не склеить части?eval здорово, если вы можете доверять вводу, но может ли он доверять его вводу?

Ответы на вопрос(5)

включенный в библиотеку math.js:

http: //mathjs.or

Пример использования:

math.eval('1.2 / (2.3 + 0.7)');   // 0.4
math.eval('5.08 cm in inch');     // 2 inch
math.eval('sin(45 deg) ^ 2');     // 0.5
math.eval('9 / 3 + 2i');          // 3 + 2i
math.eval('det([-1, 2; 3, 1])');  // -7
Решение Вопроса

eval?

рассмотреть возможностьcalc как идентификатор текстового поля. тогд

$('#calc').change(function(e){                
    alert(eval($(this).val()));
})

но не забудьте проверить ввод перед обработкой.

 osdamv02 июн. 2012 г., 00:37
@ Ohgodwhy AFAIK в chrome или ff, вы можете вводить js прямо из консоли, если пользователь хочет ввести js, он все равно сделает это
 Ohgodwhy02 июн. 2012 г., 00:16
Eval - плохой выбор для этого, он допускает эксплойты и утечки, которые позволяют вам вводиться довольно легко. Предоставляя эту опцию, а не информацию о том, как ее обезопасить, вы просто настраиваете человека на неудачу.
 osdamv04 июн. 2012 г., 20:21
@ Хуан Мендес, не могли бы вы объяснить, как это сделать в песочнице браузера javascript?
 Juan Mendes02 июн. 2012 г., 02:13
@ osdamv Проблема не в том, что пользователь на сайте вводит код. Проблема в том, что пользователь заставляет этот код работать под чужими привилегиями

но для новых посетителей, у которых похожая проблема: Строки математика package вычисляет уравнения [String], как в примере выше120/4+130/5. Он также распознает скобки.

Для этого есть три решения:

Внедрите свой собственный парсер, лексер и разберите код. Это не супер просто, но это может быть отличным опытом обучения. Бегиeval под поддоменом, предназначенным только для этого, чтобы скрипты не могли злонамеренно получить доступ к вашему сайту Санитизировать входные данные, чтобы содержать только12345678790+-/*().
 eval(input.replace(/[^0-9\(\)\+\-\*\/\.]/g, ""));

Прошу вас обойтись хитростями, чтобы обойти это решение

 Ohgodwhy02 июн. 2012 г., 00:15
Никогда не будет в безопасности.rm -rf /dir/allyour.files
 Juan Mendes02 июн. 2012 г., 00:19
@ Ohgodwhy Я с удовольствием возьму даунвот, если вы дадите мне строку ввода, для которой она не работает, ваш комментарий выглядит как тролль.
 Ohgodwhy02 июн. 2012 г., 02:19
Ваш ответ неверен, потому что ему нужен- оператор, и вы фильтруете его: более того, вы все равно можете использовать тот же код, чтобы обойти ваш eval.
 Juan Mendes02 июн. 2012 г., 02:22
@ Ohgodwhy Попробуй, прежде чем говорить чепухуeval("2-2".replace(/[^0-9\(\)\+\-\*\/\.]/g, "")) === 0 // true Я не отфильтровываю его, я храню его в белом списке, взгляни на регулярное выражение; принимает числа, операторы и скобки

если вы не разрешите идентификаторы.

function reval(string){
    var answer='';
    if(/^[\d()\/*.+-]+$/.test(str)){
        try{
            answer= eval(str);
        }
        catch(er){
            answer= er.name+', '+er.message;
        }

    }
    return answer;
}

Ваш ответ на вопрос