Вопрос по jquery, javascript – Запуск уравнения с Javascript из текстового поля

0

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

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

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

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

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

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

120/4+130/5

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

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

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

Что бы ты ни делал, держись подальше отeval Aren
@ Арен Почему? Есть много проблем сeval, но пока ввод безопасен, нет сомнений, что это самый быстрый анализатор формул для разработчиков Javascript. Я не вижу смысла притворяться, что его даже не существует. MaxArt
Вы можете использоватьeval, если вы запускаете его из iframe в домене, который предназначен только для этой цели и не может получить доступ к своему собственному домену. Juan Mendes
Его ввод - это ввод текста, ему придется проверять ввод, а это значит, что он в значительной степени выполняет всю работу по разбору ввода на вычислимые компоненты, почему бы просто не сохранить угрозу безопасности и не склеить части?eval здорово, если вы можете доверять вводу, но может ли он доверять его вводу? Aren
@ Aren Вы можете передать ввод для запуска внутри iframe в другом домене. Juan Mendes

Ваш Ответ

5   ответов
0

eval?

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

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

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

Eval - плохой выбор для этого, он допускает эксплойты и утечки, которые позволяют вам вводиться довольно легко. Предоставляя эту опцию, а не информацию о том, как ее обезопасить, вы просто настраиваете человека на неудачу. Ohgodwhy
@ Ohgodwhy AFAIK в chrome или ff, вы можете вводить js прямо из консоли, если пользователь хочет ввести js, он все равно сделает это osdamv
@ osdamv Проблема не в том, что пользователь на сайте вводит код. Проблема в том, что пользователь заставляет этот код работать под чужими привилегиями Juan Mendes
@ Хуан Мендес, не могли бы вы объяснить, как это сделать в песочнице браузера javascript? osdamv
6

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

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

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

Никогда не будет в безопасности.rm -rf /dir/allyour.files Ohgodwhy
@ Ohgodwhy Я с удовольствием возьму даунвот, если вы дадите мне строку ввода, для которой она не работает, ваш комментарий выглядит как тролль. Juan Mendes
Ваш ответ неверен, потому что ему нужен- оператор, и вы фильтруете его: более того, вы все равно можете использовать тот же код, чтобы обойти ваш eval. Ohgodwhy
@ Ohgodwhy Попробуй, прежде чем говорить чепухуeval("2-2".replace(/[^0-9\(\)\+\-\*\/\.]/g, "")) === 0 // true Я не отфильтровываю его, я храню его в белом списке, взгляни на регулярное выражение; принимает числа, операторы и скобки Juan Mendes
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
1

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

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

    }
    return answer;
}
0

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

Похожие вопросы