0

我有点卡住了,我希望更熟悉 PHP 的人能够帮助我。基本上,我正在编写一个 PHP 应用程序,它允许您通过 XML 文件插入产品。当我说产品时,我的意思是汽车租赁或保险类产品,其中有要填写的表格和要计算的费率。我选择了 XML 结构,以便将来在没有任何编码知识的情况下轻松添加或调整它们,因为底层类将完成所有工作。然而,我现在正努力寻找最安全和最好的方法,将费率计算包含在 XML 文件结构中并在 PHP 中评估它们,而不会有任何被利用的风险。因此,例如,我将用于费率计算区域的 xml 文件结构可能看起来像

<rates>
  <rate name="variable1" type="forminput" relative="form['input1']"></rate>
  <rate name="variable2" type="forminput" relative="form['input2']"></rate>
  <rate name="calculatedvariable1" type="calculation">[variable1] * [variable2]</rate>
</rates>

好的,所以这是一个非常基本的示例,但想法是我的类然后读取名称,使用 xml 解析器基于此创建一个 php 变量,并在表单中给出值(或任何相关的引用),然后当它找到了一种计算类型,它将正确命名的变量(用方括号或其他东西注明)插入计算并对其进行评估。所以在这个例子中,通过解析计算给出的输出将是:

$variable1 * $variable2

然后需要作为计算运行以获得计算变量1的值。现在我知道我可以使用 eval() 来实现这一点,但我不相信这是唯一的选择,也许我错过了我可以在我的 xml 结构或我的 php 解析它的方式中做的其他事情。无论如何,我希望我已经正确解释了它,并提前感谢任何想法。

4

1 回答 1

2

考虑到您已经解决了从基于relative属性的字符串形式的表单中检索值的问题 - 在此处命名实现resolve_variable($relative)

然后,您可以将值分配给元素本身,并以标准 xpath 1.0 表达式的形式制定您的计算,例如:

rate[@name="variable1"] * rate[@name="variable2"]

XML 中的那个表达式:

<rates>
  <rate name="variable1" type="forminput" relative="form['input1']"></rate>
  <rate name="variable2" type="forminput" relative="form['input2']"></rate>
  <rate name="calculatedvariable1" type="calculation">
    rate[@name="variable1"] * rate[@name="variable2"]
  </rate>
</rates>

在 PHP 中,您只需要使用该DOMXPath对象即可DOMDocument

$dom = new DOMDocument();
$dom->loadXML($xml); 
$xpath = new DOMXPath($dom);

然后,您可以将值分配给节点:

// assign values
foreach ($xpath->query('rate/@relative') as $relative) {
    $relative->ownerElement->nodeValue = resolve_variable($relative);
}

然后执行所有计算:

// do calculations
$results = array();
foreach ($xpath->query('rate[@type="calculation"]') as $calculation) {
    $results[$calculation->getAttribute('name')]
        = $xpath->evaluate($calculation->nodeValue);
}

然后它们以数组的形式很好地出现$results(在我的示例中,我有 3 和 5 作为值):

Array
(
    [calculatedvariable1] => 15
)

也许这对你有帮助。

请注意,如果您需要精确计算,浮点运算可能会妨碍您http://www.validlab.com/goldberg/paper.pdf

一个工作示例一目了然整个图片/上面的视图: http: //eval.in/9595

您也可以使用 XSL来做到这一点。

于 2013-02-12T14:31:03.820 回答