Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 排除列表中和短语列表中未包含的所有字符_Php_Regex_Regex Negation - Fatal编程技术网

Php 排除列表中和短语列表中未包含的所有字符

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

我试图在PHP中创建一个函数来计算数学表达式——包括sin、cos等函数。我的方法是删除短语中所有不是数字、数学运算符或数学函数的字符,然后在eval()中使用该字符串。问题是我对正则表达式了解不够,无法对同一表达式中的字符和短语进行否定

到目前为止,我得到的是:

$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命令”<代码>评估=-邪恶(在大多数情况下…)谢谢你,瑞肯。我已经有十多年没有看到这一点了,并且(相当不方便地)忘记了这一点。我想我将不得不编写一个解析器,而不仅仅是试图用一个快速的解决方案逃脱惩罚。