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