我想操纵像“...4+3(4-2)-...”这样的字符串变成“...4+3*(4-2)-...”,但它当然应该识别任何数字,d,然后是'('并将其更改为'd*('。我还想将')('更改为')*('如果可能,同时进行。如果有可能添加对 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 或其他一些正则表达式函数可以做得更好?但是我认为那些手册真的很难掌握。
最佳答案
让我们从您要查找的内容开始:
- 以下任一项:(
(a|b)
将匹配a
或b
)- 任何数字,
\d
- 字符
)
:\)
- 任何数字,
- 后跟
(
:\(
它创建了这个模式:(\d|\))\(
。但是由于你想修改字符串并保留这两个部分,你可以将 \(
这导致 (\()
更难阅读但更好处理。
现在剩下的就是告诉如何重新排列,很简单:\\1*\\2
,留给你这样的代码
$regex = "/(\d|\))(\()/";
$replace = "\\1*\\2";
$new = preg_replace($regex, $replace, $test);
要查看该模式实际上匹配所有情况,请参阅 this example .
关于php - 如何操作字符串以便在数学表达式中显式显示隐式乘法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24501213/