Php 如何操纵字符串,使隐式乘法在数学表达式中显式化?

Php 如何操纵字符串,使隐式乘法在数学表达式中显式化?,php,regex,preg-replace,Php,Regex,Preg Replace,我想操纵一个字符串,比如“…4+3(4-2)-…”变成“…4+3*(4-2)-…”,但它当然应该识别任何数字,d,后跟一个“(”,并将其更改为“d*”。我还想更改)(“to”)*('如果可能的话,请同时使用。如果可以添加对pi或e等常量的支持,那就太好了 现在,我只是用这种愚蠢的方式: private function make_implicit_multiplication_explicit($string) { $i=1; if(strlen($string)>1)

我想操纵一个字符串,比如“…4+3(4-2)-…”变成“…4+3*(4-2)-…”,但它当然应该识别任何数字,d,后跟一个“(”,并将其更改为“d*”。我还想更改)(“to”)*('如果可能的话,请同时使用。如果可以添加对pi或e等常量的支持,那就太好了

现在,我只是用这种愚蠢的方式:

private function make_implicit_multiplication_explicit($string)
{
    $i=1;
    if(strlen($string)>1)
    {
        while(($i=strpos($string,"(",$i))!==false)
        {
            if(strpos("0123456789",substr($string,$i-1,1))) 
            {
                $string=substr_replace($string,"*(",$i,1);
                $i++;
            }
            $i++;
        }

        $string=str_replace(")(",")*(",$string);
    }        
    return $string;
 }

但是我相信使用preg_replace或其他一些正则表达式函数可以做得更好,但我认为这些手册很难掌握。

您的php代码应该是

<?php
$mystring = "4+3(4-2)-(5)(3)";
$regex = '~\d+\K\(~';
$replacement = "*(";
$str = preg_replace($regex, $replacement, $mystring);
$regex1 = '~\)\K\(~';
$replacement1 = "*(";
echo preg_replace($regex1, $replacement1, $str);
?> //=>  4+3*(4-2)-(5)*(3)
/=>4+3*(4-2)-(5)*(3)
说明:

  • ~\d+\K\(~
    这将匹配一个或多个数字,后面跟着一个
    )。因为\K,它排除了\d+
  • 同样,它用
    *(
    替换匹配的部分,然后生成
    3*(
    ),结果存储在另一个变量中
  • \)\K\(
    匹配
    )(
    并排除第一个
    。这将被
    *(
    替换,后者反过来产生
    )*(


让我们从您要寻找的内容开始:

  • 以下任一项:(
    (a | b)
    将匹配
    a
    b
    • 任何数字,
      \d
    • 字符
      \)
  • 后跟
    \(
它创建了这个模式:
(\d |\)\(
)\。但是,由于您希望修改字符串并保留这两个部分,您可以对
\(
进行分组,这会导致
(\()
使读取更困难,但处理起来更好

现在剩下的一切就是告诉你如何重新排列,这很简单:
\\1*\\2
,留给你这样的代码

$regex = "/(\d|\))(\()/";
$replace = "\\1*\\2";
$new = preg_replace($regex, $replace, $test);
要查看模式是否与所有情况都匹配,请参阅。

愚蠢的方法:^)


要识别任何后跟
一个
组合)(
的数字并在它们之间放置星号,可以使用断言组合

echo preg_replace("/

         (?<=[0-9)])   # look behind to see if there is: '0' to '9', ')'
         (?=\()        # look ahead to see if there is: '('

         /x", '*', '(4+3(4-2)-3)(2+3)'); 

你有什么反对正则表达式的吗?@sectus它们很难掌握,我很想学,这就是为什么我问这个问题:)谢谢!我试过这个,它很有效。感谢你的解释,我也认为我理解它,即使这些模式真的很催眠。@NickSick不客气。逃避的需要
/
虽然不容易理解,但它是一个简单的逻辑。然而,还有更高级的逻辑,如hwnd或Avinash Raj发布的。这很好地证明了当使用正则表达式时,所有的路都通向Romex,因为我也希望支持常量、函数和变量,我最终(?)得到了$regex=”/((?也谢谢你!很高兴看到这么多不同的解决方案。@NickSick我们可以在PCRE正则表达式类型的问题中发布许多可能的解决方案。顺便说一句,谢谢你对
\K
的解释,浪费的时间比我看到你的post@kingkero没问题=)
echo preg_replace("/

         (?<=[0-9)])   # look behind to see if there is: '0' to '9', ')'
         (?=\()        # look ahead to see if there is: '('

         /x", '*', '(4+3(4-2)-3)(2+3)'); 
echo preg_replace("/

         [0-9)]   # any character of: '0' to '9', ')'
          \K      # resets the starting point of the reported match
          (?=\()  # look ahead to see if there is: '('

         /x", '*', '(4+3(4-2)-3)(2+3)');