在PHP崩溃apache中使用正则表达式验证文本

在PHP崩溃apache中使用正则表达式验证文本,php,regex,apache,Php,Regex,Apache,我正在PHP应用程序中使用此函数验证文本: public function alpha_special($str) { return ( ! preg_match("/^([-a-zA-Z0-9_-ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöùúûüýøþÿÐdŒ!?¿¡()\".',:@\n\r ]){0,350}+$/i", $str)) ? FALSE : TRUE; } 它是一个产品的描述字段,因此应该允许使用字

我正在PHP应用程序中使用此函数验证文本:

public function alpha_special($str)
{
    return ( ! preg_match("/^([-a-zA-Z0-9_-ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöùúûüýøþÿÐdŒ!?¿¡()\".',:@\n\r ]){0,350}+$/i", $str)) ? FALSE : TRUE;
} 
它是一个产品的描述字段,因此应该允许使用字母数字以外的一些字符,也可以使用空格,输入关键字换行符,限制为350个字符

一切正常,除非我尝试输入一个有大量空格和换行符的文本。如果我这样做,我会得到一个windows错误,说ApacheHTTP服务器已经停止工作(我正在XAMPP上运行它)

但是,如果我删除\n或\r正则表达式,它不会崩溃,但不允许换行

我做错了什么


谢谢

由于PHP设置
PCRE.recursion\u limit
太大,PCRE库中出现分段错误和堆栈溢出,Apache正在崩溃。请参阅我对一个相关问题的回答:有关此问题的更深入讨论

正则表达式的形式为:
(a)+
,当应用于大型主题字符串时,将导致分段错误崩溃。但是,对于这种特定情况,捕获组是不必要的,可以像这样简单地删除:

公共功能alpha_特殊($str)
{
“回归回归(!怀孕)和U比赛(比赛(比赛)的回归(!怀孕)的比赛(比赛(比赛)的回归((比赛)的比赛(比赛)的比赛(比赛)的比赛(比赛)中,“/^(a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-a-扎-扎-Z0-10-10-9-19-19-19-19-19 19-19 19 19日日日日日日日日日日(19 19 19 19 19 19 19 19十九十九十九十九十九十九十九十九十九十九十九十九十九十九十九十九十九十九十九十九十九十九十九十九十九十九十九十九十九十九十九十九十九十九十九十九十九十九日日日日日日日,在本本本甲甲甲甲甲甲甲甲甲甲甲甲甲甲甲甲甲甲甲甲甲甲甲甲甲甲甲甲@\n\r]{0350}+$/i“,$str”)?FALSE:TRUE;
}

此更改应该可以解决您眼前的问题。

您可以尝试双转义吗
@\\n\\r
看起来像PHP本身的一个错误。尝试了双转义,但都不起作用。我还意识到,即使没有空格和换行符,它也会崩溃。崩溃只需要大约100个字符。是的,PHP设置了
pcre.recursion\u limi默认情况下,t
太大(100000)和
httpd.exe
由于堆栈溢出而崩溃。请参阅我对相关问题的回答:以获取有关问题的更详细描述和建议的解决方案。感谢ridgerunner。我在另一篇文章中阅读了您的答案,这很好,但我是一个初学者,不知道如何实现该解决方案,特别是在生产环境中有没有其他方法可以轻松验证服务器端而不发生此错误?很好!它正在工作,不再崩溃。谢谢!