使用 PHP 匹配数学方程式

Matching for math equations using PHP

我正在尝试为数学方程式编写 preg_match,但由于某些原因,当我 print_r 时,它什么也没有出现。我不确定我做错了什么。

$text = "22/7";
preg_match("~([0-9]+([+\-*x]|(?:plus|add|minus|subtract|divide|time|multiply)(?:es|s)?(?: by)?)(?: )?[0-9]+)(((([+\-*x]|plus|add|minus|subtract|divide|time|multiply)(?:es|s)?(?: by)?)(?: )?([0-9]+))+)?~", $text, $match);
print_r($match);

原始问题

问题是字符组中没有除号:

[+\-*x]

并应改为:

[+*x/-]

增强

进一步研究您的正则表达式后,我想看看是否可以稍微简化它,同时添加功能。我想到了这个:

^((-?\d+(?:\.\d+)?)(?:[*+/^eE-]| (?:to the power of|plus|add|minus|subtract|divided?|times|multipl(?:y|ied))(?: by)?)(?: )?)(?1)*(?2)$

查看 demo

我添加了:

  • 浮点数,(1.58-0.58)
  • 可选减号,(2*-4)
  • (2^8)
  • 的幂
  • 科学计数法(9e100)
  • 递归模式 (2^8*10-9)

很高兴您使用 PHP - 使用 PCRE 正则表达式引擎,您可以做一些很酷的事情。

细分:

  • (-?\d+(?:\.\d+)?) - 捕获一个可选的减号,然后是一个数字,然后是一个可选的点和更多数字(减号和浮点加法)
  • [*+/^eE-] - 该组中的任何字符(科学记数法,加法)
  • (?:to the power of|plus|add|minus|subtract|divided?|times|multipl(?:y|ied))(?: by)? - 此中的任何组(已添加 "to the power of")
  • (?1)*(?2) - 尽可能多次递归第 1 组的正则表达式(它之前的整个模式),然后递归第 2 组的正则表达式(数字部分),以始终以数字结尾(递归模式)