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

时间:2016-02-15 18:22:38

标签: php regex

所以我试图创建一个正则表达式而没有成功。

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

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\+\-\*\/\(\)\.]/'

感谢每一个帮助。

4 个答案:

答案 0 :(得分:3)

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

所以替换这个:

\{(.+?)\}|[^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)会抛出不属于数字的逗号

不幸的是,如果没有更好的规格,我就无法说其他话。

答案 1 :(得分:2)

一个良好的开端是用文字记下你想要匹配的模式。例如,您已经说过,您知道这些操作位于{}内,但在您第一次尝试使用正则表达式时,这并不会出现。

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

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

鉴于以上清单:

  • 匹配括号很简单:[()]
  • 可以使用[0-9]\d来匹配数字;至少有一个是+;所以“数字”是\d+
  • 逗号数字很简单:,\d+;使?成为可选项,然后获得\d+(,\d+)?
  • 四个操作中的任何一个只是[+*/-];转义/-以获取[+*\/\-]不要忘记{}在正则表达式中具有特殊含义,因此需要转义为{{ 1}}和\{;我们在大括号中的操作列表变为:\}

现在我们必须把它放在一起;一种方法是使用\{[+*\/\-]\}按顺序查找任何这些模式的所有出现,然后我们可以将它们重新组合在一起。所以我们的正则表达式只是“这个或这个或这个或这个”:

preg_match_all

我没有对此进行过测试,但考虑到我是如何对其进行解释的,希望您可以弄清楚如何测试它的部分并在必要时进行调整。

答案 2 :(得分:1)

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

eval 之前 EXTRA 检查输入!!!

$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_digitctype_alnumevalstr_splitstr_replace

P.S:我认为考虑了基本操作之前的减号。

答案 3 :(得分:0)

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

$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