在javascripts和php中连接数字

在javascripts和php中连接数字,javascript,php,Javascript,Php,我将一些代码从javascript翻译成php,我的问题是数字,因为在javascript中,在加法和串联两种情况下都使用“+”。 例: 在javascript中,结果是22372 如何在php中实现这一点?我试着用preg_替换 1+1 --> 2 2+"2" --> "22" // as string ""+2 --> "2" 问题在于: (1+1+ "2" +"4"+3 - 5 -1)+""+2 我需要解决()问题,然后在php中用“”和2连接字符串,字符串连接是用

我将一些代码从javascript翻译成php,我的问题是数字,因为在javascript中,在加法和串联两种情况下都使用“+”。 例:

在javascript中,结果是22372

如何在php中实现这一点?我试着用preg_替换

1+1 --> 2
2+"2" --> "22" // as string
""+2 --> "2" 
问题在于:

(1+1+ "2" +"4"+3 - 5 -1)+""+2

我需要解决()问题,然后在php中用“”和2连接字符串,字符串连接是用“.”而不是“+”完成的。您仍然可以连接不同类型的值,例如

$apple_count = 25;
$my_string = "I want " . $apple_count . " apples.";
我正在研究一个解决方案

echo $a." = 22372"."\n";
function concat_num($a) {
 while (preg_match("/\"(\d+)\"\s*\+\s*(\d+)/",$a) || preg_match("/^(?!\-)\s*(\d+)\s*\+\s*\"(\d+)\"/",$a)) { // "10" + 2 or 2 + "10"
 while (preg_match("/(\d+)\s*\+\s*(\d+)/",$a)) {    //1 + 2 --> 3
  $a=preg_replace_callback(
    "/(\d+)\s*\+\s*(\d+)/",
    function ($m) {
      return floor($m[1]+$m[2]);
    },
    $a
    );
 }
 echo $a."\n";
 while (preg_match("/\"\"\s*\+\s*(\d+)/",$a)) {
  $a=preg_replace("/\"\"\s*\+\s*(\d+)/",'"'."\$1".'"',$a);  // ""+11   ---> "11"
 }
 echo $a."\n";
 while (preg_match("/(\d+)\s*\+\s*\"\"/",$a)) {
  $a=preg_replace("/(\d+)\s*\+\s*\"\"/",'"'."\$1".'"',$a);  // 11+""   ---> "11"
 }
 echo $a."\n";
 while (preg_match("/\"(\d+)\"\s*\+\s*\"\"/",$a)) {
  $a=preg_replace("/\"(\d+)\"\s*\+\s*\"\"/",'"'."\$1".'"',$a); // "11"+"" --> "11"
 }
 echo $a."\n";
 while (preg_match("/\"\"\s*\+\s*\"(\d+)\"/",$a)) {
  $a=preg_replace("/\"\"\s*\+\s*\"(\d+)\"/",'"'."\$1".'"',$a);  // ""+"22" -->"22"
 }
 echo $a."\n";
 while (preg_match("/\"(\d+)\"\s*\+\s*\"(\d+)\"/",$a)) {
  $a=preg_replace("/\"(\d+)\"\s*\+\s*\"(\d+)\"/",'"'."\$1\$2".'"',$a); // "11"+"22" --> "1122"
 }
 echo $a."\n";
 while (preg_match("/\"(\d+)\"\s*\+\s*(\d+)/",$a)) {
  $a=preg_replace("/\"(\d+)\"\s*\+\s*(\d+)/",'"'."\$1\$2".'"',$a); // "11"+22 -->> "1122"
 }
 echo $a."\n";
 while (preg_match("/^(?!\-)\s*(\d+)\s*\+\s*\"(\d+)\"/",$a,$m)) {
 $a=preg_replace("/^(?!\-)\s*(\d+)\s*\+\s*\"(\d+)\"/",'"'."\$1\$2".'"',$a); // 11+"22" --->> "1122"
 }
 echo $a."\n";
 while (preg_match("/\"(\d+)\"\s*\-\s*(\d+)/",$a)) {  // "10" - 8 --> 2
  $a=preg_replace_callback(
    "/\"(\d+)\"\s*\-\s*(\d+)/",
    function ($m) {
      return floor($m[1]-$m[2]);
    },
    $a
  );
 }
 echo $a."\n";
 while (preg_match("/(\d+)\s*\-\s*(\d+)/",$a)) {    //5 - 2 --> 3
  $a=preg_replace_callback(
    "/(\d+)\s*\-\s*(\d+)/",
    function ($m) {
      return floor($m[1]-$m[2]);
    },
    $a
    );
 }
 echo $a."\n";
 }
 return $a;
}
echo $b=concat_num($a)."\n";
$code="\$d=".$b.";";
eval ($code);
echo $d."\n";
和结果

1+1+ "2" +"4"+3 - 5 -1+"" + 2 = 22372
2+ "2" +"4"+3 - 5 -1+"" + 2
2+ "2" +"4"+3 - 5 -1+"2"
2+ "2" +"4"+3 - 5 -1+"2"
2+ "2" +"4"+3 - 5 -1+"2"
2+ "2" +"4"+3 - 5 -1+"2"
2+ "24"+3 - 5 -1+"2"
2+ "243" - 5 -1+"2"
"2243" - 5 -1+"2"
2238 -1+"2"
2237+"2"
2237+"2"
2237+"2"
2237+"2"
2237+"2"
2237+"2"
2237+"2"
2237+"2"
"22372"
"22372"
"22372"
"22372"
22372
这似乎可行,但最好的解决方案是从头到尾计算字符串

1+1 --> 2 (num)
2+"2" --> "22" (string)
"22"+"4" --> "224" (string)
"224"+3 --> "2243" (string)
2243-5 --> 2238 (num)
2238-1 --> 2237 (num)
2237+"" --> "2237" (string)
"2237"+"2" --> "22372" (string)

这不是我想要的。@vb6rocod这是你想要的。如果将所有
+
替换为
(第一个除外,您希望添加它),则会得到
echo 1+1。"2" . "4" . 3 - 5 -1 . "" . 2;产生你想要的结果。我不知道如何表达,它是从一个javascript和改变。。。现在可以是1+“22”,如果你理解我的话,下次可以是2-3。我需要一个通用的解决方案(如果有的话),所以我不知道$apple\u count的值,或者我是否有任何连接或是一个简单的数学。expresion和我不需要连接。希望了解我的困境。。。什么时候是加法(+),什么时候是连接(.)@vb6rocod要计算通用javascript表达式?我想最简单、最正确的解决方案就是简单地使用javascript解释器。例如,您可以在php中使用exec使用node.js来实现这一点:
exec(“echo”console.log($expression)| node”)
@vb6rocod,或者您也可以查看诸如php js之类的项目,它允许您在php中运行javascript:Just do
1+1。"2"  ."4" . 3 - 5 - 1 . "" . 2
JavaScript希望变得聪明,并最终让用户感到困惑<代码>+
在两个操作数都是数字时进行加法,但如果一个或两个操作数都是字符串,则无论它们是否包含数字,加法都会变成串联。PHP对这两个操作使用不同的运算符:
+
始终表示加法(它通过查找最长的数字前缀将操作数转换为数字),
始终表示串联(它将操作数转换为字符串,无论其类型和/或值如何)。
1+1 --> 2 (num)
2+"2" --> "22" (string)
"22"+"4" --> "224" (string)
"224"+3 --> "2243" (string)
2243-5 --> 2238 (num)
2238-1 --> 2237 (num)
2237+"" --> "2237" (string)
"2237"+"2" --> "22372" (string)