Php 排除列表中和短语列表中未包含的所有字符
我试图在PHP中创建一个函数来计算数学表达式——包括sin、cos等函数。我的方法是删除短语中所有不是数字、数学运算符或数学函数的字符,然后在eval()中使用该字符串。问题是我对正则表达式了解不够,无法对同一表达式中的字符和短语进行否定 到目前为止,我得到的是:Php 排除列表中和短语列表中未包含的所有字符,php,regex,regex-negation,Php,Regex,Regex Negation,我试图在PHP中创建一个函数来计算数学表达式——包括sin、cos等函数。我的方法是删除短语中所有不是数字、数学运算符或数学函数的字符,然后在eval()中使用该字符串。问题是我对正则表达式了解不够,无法对同一表达式中的字符和短语进行否定 到目前为止,我得到的是: $input = preg_replace("/[^0-9+\-.*\/()sincota]/", "", $input); 显然,sin、cos和tan的字符可以在输入表达式中按任意顺序使用(而不仅仅允许使用sin、cos和tan
$input = preg_replace("/[^0-9+\-.*\/()sincota]/", "", $input);
显然,sin、cos和tan的字符可以在输入表达式中按任意顺序使用(而不仅仅允许使用sin、cos和tan短语)。如果我进一步扩展此函数以包含更多字符和函数,则会带来更大的安全风险,因为恶意用户可以通过与应用程序的巧妙交互执行几乎任何PHP命令
有人能告诉我如何修复正则表达式并消除此问题吗?您可以尝试以下方法:
preg_replace("/(sin|cos|tan)?[^0-9+\\.*\/()-]/", "$1", $input);
但是,如果您试图解析表达式以对其求值,我建议您解析它,而不是简单地通过正则表达式模式传递它。您可以尝试以下方法:
preg_replace("/(sin|cos|tan)?[^0-9+\\.*\/()-]/", "$1", $input);
但是,如果您试图解析表达式以对其求值,我建议您解析它,而不是简单地通过正则表达式模式传递它
我正在尝试在中创建一个函数
PHP,它将评估一个数学模型
表达式——包括以下函数
罪、因等
我是否可以建议利用已经投入的多年工作,其中包括一个公式解析器
它包括cos
,sin
和数百个其他的
否则,您可以寻找积极匹配,而不是否定:
$matches = array();
preg_match_all("#([0-9,/\*()+\s\.-]|sin|cos)+#", 'sin(12) + cos(13.5/2) evddal * (4-1)', $matches);
echo implode('', $matches[0]);
/* output:
sin(12) + cos(13.5/2) * (4-1)
*/
我正在尝试在中创建一个函数
PHP,它将评估一个数学模型
表达式——包括以下函数
罪、因等
我是否可以建议利用已经投入的多年工作,其中包括一个公式解析器
它包括cos
,sin
和数百个其他的
否则,您可以寻找积极匹配,而不是否定:
$matches = array();
preg_match_all("#([0-9,/\*()+\s\.-]|sin|cos)+#", 'sin(12) + cos(13.5/2) evddal * (4-1)', $matches);
echo implode('', $matches[0]);
/* output:
sin(12) + cos(13.5/2) * (4-1)
*/
嗯,大多数语言都会抛出语法错误,而不是尝试最佳猜测,这是有原因的,因为疯狂是存在的(在某些情况下,你必须是一个非常好的猜测者)。您的解决方案仍然是一个解析器,而不是正则表达式(真的,这并不是那么难),瞧,不必担心执行“任何PHP命令”<代码>评估=-邪恶(在大多数情况下…)谢谢你,瑞肯。我已经有十多年没有看到这一点了,并且(相当不方便地)忘记了这一点。我想我将不得不编写一个解析器,而不仅仅是试图快速解决问题。嗯,大多数语言都会抛出语法错误,而不是尝试最佳猜测,这就是疯狂所在(在某些情况下,你必须是一个非常好的猜测者)。您的解决方案仍然是一个解析器,而不是正则表达式(真的,这并不是那么难),瞧,不必担心执行“任何PHP命令”<代码>评估=-邪恶(在大多数情况下…)谢谢你,瑞肯。我已经有十多年没有看到这一点了,并且(相当不方便地)忘记了这一点。我想我将不得不编写一个解析器,而不仅仅是试图用一个快速的解决方案逃脱惩罚。