用于数学运算的 PHP 正则表达式


PHP regex for math operations

所以我正在尝试创建一个正则表达式但没有成功。

这是我在输入字符串中得到的:

String A: "##(ABC 50a- {+} UDF 69,22g,-) {*} 3##"
String B: "##ABC 0,10,- DEF {/} 9 ABC {*} UHG 3-##"

这就是我需要从正则表达式中处理的内容:

Result A: "(50+69,22)*3"
String B: "0,10/9*3"

我只是无法将数字替换与操作符号结合使用。

这就是我得到的:

'/[^0-9'+'-'*'/'(')'.]/'

感谢每一个帮助。

一个简单的解决方案包括摆脱你不想要的一切。

所以替换这个:

'{(.+?)'}|[^0-9,{}()]+|(?<!'d),|,(?!'d)

$1.

足够简单:

$input = "(ABC 50a- {+} UDF 69,22g,-) {*} 3";
$output = preg_replace('#'{(.+?)'}|[^0-9,{}()]+|(?<!'d),|,(?!'d)#', '$1', $input);
  • '{(.+?)'}部分与{内部的所有内容相匹配......}并输出它(它被$1替换(
  • [^0-9,{}()]+删除了
  • 不属于我们试图保留的每个字符(它被替换为空字符串(
  • (?<!'d),|,(?!'d)抛出不属于数字的逗号

不幸的是,如果没有更好的规格,我不能说太多。

一个好的开始是用文字写下你想要匹配的模式。例如,您说过您知道操作在 {} 内部,但这在您第一次尝试正则表达式时不会出现在任何地方。

您还可以将其分解为单独的部分,然后稍后构建。例如,您可能会说:

  • 如果您看到括号,请将其保留在最终答案中
  • 数字由
  • 任一数字组成...
  • 。或数字后跟逗号和更多数字
  • 操作始终在大括号中,并且是+-*/
  • 其他一切都应该扔掉

给定上面的列表:

  • 匹配括号很容易: [()]
  • 匹配一个数字可以用[0-9]'d来完成;至少有一个是+;所以"数字"是'd+
  • 逗号数字很简单:,'d+ ; 用?让它可选,你会得到'd+(,'d+)?
  • 四个操作中的任何一个都是[+*/-]的;转义/-以获得[+*'/'-]不要忘记{}在正则表达式中具有特殊含义,因此需要作为'{'}进行转义;我们在大括号中的操作列表变为:'{[+*'/'-]'}

现在我们必须把它放在一起;一种方法是使用preg_match_all来按顺序找到任何这些模式的所有出现,然后我们可以将它们重新组合在一起。所以我们的正则表达式只是"这个或这个或这个或这个":

/[()]|'d+(,'d+)?|'{[+*'/'-]'}/

还没有测试过这个,但考虑到我是如何到达它的解释,希望你能弄清楚如何测试它的一部分并在必要时进行调整。

我不擅长正则表达式,但我找到了另一种方法:

在运行 eval 之前对输入进行额外检查!!

$string = "(ABC 50a- {+} UDF 69,22g) {*} 3";
$new ='';
$string = str_split($string);
foreach($string as $char) {
   if(!ctype_alnum($char) || ctype_digit($char) ){
    //you don't want letters, except symbols like {, ( etc
     $new .=$char;
   }
}
//echo $new; will output -> ( 50- {+}  69,22) {*} 3
//remove the brackets although you could put it in the if statement ...
$new = str_replace(array('{','}'),array('',''), $new);
//floating point numbers use dot not comma
$new = str_replace(',','.', $new);
$p = eval('return '.$new.';');
print $p; // -57.66

使用: ctype_digit, ctype_alnum, 评估, str_split, str_replace

PS:我假设考虑了基本操作之前的减号。

在离开办公室之前快速尝试一下;-(

$data = array(
  "(ABC 50a- {+} UDF 69,22g) {*} 3",
  "ABC 0,10- DEF {/} 9 ABC {*} UHG 3-"
);
foreach($data as $d) {
  echo $d . " = " . extractFormula($d) . "'n";
}
function extractFormula($string) {
  $regex = '/([()])|([0-9]+(,[0-9]+)?)|'{([+'*'/-])'}/';
  preg_match_all($regex, $string, $matches);
  $formula = implode(' ', $matches[0]);
  $formula = str_replace(array('{', '}'),NULL,$formula);
  return $formula;
}

输出:

(ABC 50a- {+} UDF 69,22g) {*} 3 = ( 50 + 69,22 ) * 3
ABC 0,10- DEF {/} 9 ABC {*} UHG 3- = 0,10 / 9 * 3

如果有人喜欢摆弄代码,这里有一个活的例子:http://sandbox.onlinephpfunctions.com/code/373d76a9c0948314c1d164a555bed847f1a1ed0d