Для некоммерческого математического сайта мне понадобится функция, с помощью которой я могу обнаружить вложенные дроби из строки, а затем применить следующий метод к числителю / знаменателю
var a = nerdamer('divide((numerator),(denominator))');
Так что, если пользователь вводит данные, такие как
( a^2-b^2 ) / (a-b)
результат должен быть + b. Однако это также должно работать с вложенными дробями.
Я пытался сделать это с помощью Regex, но мне не удалось. Поэтому я прошу здесь о помощи.
С наилучшими пожеланиями, Леон
Прежде всего я хотел бы указать на две вещи.
1. Я автор всезнайки
2. Nerdamer — это библиотека JavaScript, но этот вопрос помечен как PHP.
Я не уверен, что вам известны методы знаменателя и числителя. Так, например.
var result1 = nerdamer('(4a^2-b^2)/(2a-b)').denominator();
console.log(result1.toString()); //-b+2*a
Возможно, вы уже пробовали это и заметили, что это не работает для примеров, как указано выше. Итак, следующее
var result2 = nerdamer('(4x^2-9y^2 )/(2x+3y)+(4a^2-b^2)/(2a-b)').denominator();
console.log(result2.toString()); //1
Чтобы решить эту проблему, вам может потребоваться прямой доступ к символу и использование недокументированного метода с именем collectSymbols
, Таким образом, вы могли бы сделать следующее
var terms = nerdamer('(4x^2-9y^2 )/(2x+3y)+(4a^2-b^2)/(2a-b)').symbol.collectSymbols();
console.log(terms.toString()); //[(-9*y^2+4*x^2)*(2*x+3*y)^(-1),(-b+2*a)^(-1)*(-b^2+4*a^2)]
Это возвращает массив, содержащий все «условия». Проблема в том, что это может иметь непредвиденные последствия, так как
var unintended = nerdamer('(a+b)(x-y)').symbol.collectSymbols();
console.log(unintended.toString()); //[-y+x,a+b]
Таким образом, чтобы быть в безопасности, проверьте с помощью isComposite
метод. Решение в конечном итоге будет
var symbol = nerdamer('(4x^2-9y^2 )/(2x+3y)+(4a^2-b^2)/(2a-b)').symbol;
if(symbol.isComposite()) {
var terms = symbol.collectSymbols();
var denominators = terms.map(function(x) {
return nerdamer(x).denominator();
});
console.log(denominators.toString()); //[2*x+3*y,-b+2*a]
}
Надеюсь, это решение, которое вы ищете.
Других решений пока нет …