PHP 部分存储在字符串中的计算
PHP calculation where part is stored in string
使用类似这样的代码
$tk = intval($_GET['tk']);
$vosa = $_GET['vosa'];
echo $tk*100*$vosa;
其中 $vosa 是类似于 0.0425/1920*60*8
的字符串。我需要将其替换,无需先计算,进入回显,然后回显整个结果 $tk*100*0.0425/1920*60*8
。我怎样才能做到这一点?
好的,另一个版本。用 sprintf
替换字符串中的值。
echo sprintf("%s*100*%s", (string)$tk, (string)$vosa);
如果 %d
的数字与您的情况不符,那么您可以使用 %s
。您在您的案例中直接使用 $_GET
变量。所以sprintf是一个不错的选择。我已经测试过:
php -r 'echo sprintf("%s*100*%s", "123", "4.000");'
输出:
123*100*4.000
要输出,只需回显字符串:
echo "{$vosa} = {$result}";
您的问题是如何从 $vosa
.
计算 $result
一种非常冒险的方法是使用 eval()
- 或者有时有人称之为 evil()
.
风险在于我可以向您发送 system('FORMAT C: /AUTOTEST')
的 vosa
值(这不会起作用,但您明白我的意思)。
// vosa='/bin/dd if=/dev/zero of=etc etc'
// This will return zero. It will return a whole lot of zeroes
// all over your hard disk.
$result = eval("return {$tk}*100*{$vosa};");
可能,使用正则表达式验证 $vosa
可能会有所帮助,至少只要您使用简单的表达式。
或者,您必须实施 expression parser。
这是另一个 ready made。你会像这样使用它:
include('./some/where/mathparser.php');
$parser = new MathParser();
$parser->setExpression("{$tk}*100*{$vosa}");
$result = $parser->getValue();
echo "The result of {$tk}*100*{$vosa} is {$result}.";
您可以使用字符串,然后使用 eval
将其作为 php 代码执行:
<?php
$tk = intval($_GET['tk']);
$vosa = $_GET['vosa'];
echo eval("return $tk*100*$vosa;");
Caution
The eval() language construct is very dangerous because it allows execution of arbitrary PHP code. Its use thus is discouraged. If you have carefully verified that there is no other option than to use this construct, pay special attention not to pass any user provided data into it without properly validating it beforehand.
$tk = intval($_GET['tk']);
$vosa = $_GET['vosa']; // "0.0425/1920*60*8"
$ans = eval('return '.$vosa.';');
echo $ans;
echo "<br>";
echo $tk*100*$ans;
我自己知道了
<?php
$tk = $_GET['tk'];
$aeg = $_GET['aeg'];
$kfc = $_GET['kfc'];
$vosa = $_GET['vosa'];
$final = $tk.'*'.$aeg.'*'.$kfc.'*'.$vosa;
$ans = eval('return '.$final.';');
echo round($ans,2);
使用类似这样的代码
$tk = intval($_GET['tk']);
$vosa = $_GET['vosa'];
echo $tk*100*$vosa;
其中 $vosa 是类似于 0.0425/1920*60*8
的字符串。我需要将其替换,无需先计算,进入回显,然后回显整个结果 $tk*100*0.0425/1920*60*8
。我怎样才能做到这一点?
好的,另一个版本。用 sprintf
替换字符串中的值。
echo sprintf("%s*100*%s", (string)$tk, (string)$vosa);
如果 %d
的数字与您的情况不符,那么您可以使用 %s
。您在您的案例中直接使用 $_GET
变量。所以sprintf是一个不错的选择。我已经测试过:
php -r 'echo sprintf("%s*100*%s", "123", "4.000");'
输出:
123*100*4.000
要输出,只需回显字符串:
echo "{$vosa} = {$result}";
您的问题是如何从 $vosa
.
$result
一种非常冒险的方法是使用 eval()
- 或者有时有人称之为 evil()
.
风险在于我可以向您发送 system('FORMAT C: /AUTOTEST')
的 vosa
值(这不会起作用,但您明白我的意思)。
// vosa='/bin/dd if=/dev/zero of=etc etc'
// This will return zero. It will return a whole lot of zeroes
// all over your hard disk.
$result = eval("return {$tk}*100*{$vosa};");
可能,使用正则表达式验证 $vosa
可能会有所帮助,至少只要您使用简单的表达式。
或者,您必须实施 expression parser。
这是另一个 ready made。你会像这样使用它:
include('./some/where/mathparser.php');
$parser = new MathParser();
$parser->setExpression("{$tk}*100*{$vosa}");
$result = $parser->getValue();
echo "The result of {$tk}*100*{$vosa} is {$result}.";
您可以使用字符串,然后使用 eval
将其作为 php 代码执行:
<?php
$tk = intval($_GET['tk']);
$vosa = $_GET['vosa'];
echo eval("return $tk*100*$vosa;");
Caution The eval() language construct is very dangerous because it allows execution of arbitrary PHP code. Its use thus is discouraged. If you have carefully verified that there is no other option than to use this construct, pay special attention not to pass any user provided data into it without properly validating it beforehand.
$tk = intval($_GET['tk']);
$vosa = $_GET['vosa']; // "0.0425/1920*60*8"
$ans = eval('return '.$vosa.';');
echo $ans;
echo "<br>";
echo $tk*100*$ans;
我自己知道了
<?php
$tk = $_GET['tk'];
$aeg = $_GET['aeg'];
$kfc = $_GET['kfc'];
$vosa = $_GET['vosa'];
$final = $tk.'*'.$aeg.'*'.$kfc.'*'.$vosa;
$ans = eval('return '.$final.';');
echo round($ans,2);