2013-10-16 62 views
2

的preg_match停止执行代码这里的问题: 这行代码PHP没有错误

preg_match("/^([^<>}{\|])+$/", "Testing bla di bla and more stupid text text text") 

完全停止我的脚本。 如果我把最后一个“文本”从它中拿出来,它会起作用并给我一个结果。

原代码是不是我的,我不擅长用正则表达式,但这个想法是检查以下任何特殊字符在文本:

^ < > { } \ | 

在我的搜索,我发现一些关于PREG_RECURSION_LIMIT_ERROR,但将其设置为10000并没有改变任何东西。 preg_last_error()也没有帮助,因为脚本只能在输出或记录任何内容之前停止。 PHP错误日志中没有任何内容。

我有两个问题:

  1. 为什么它只是停止没有任何通知?
  2. 是否有更好的方法来编写可能不会导致此问题的正则表达式模式?

谢谢!

PS:我正在运行PHP 5.2.9版本,其目的是为了防止特殊字符被保存,所以我想检测它们的存在并拒绝提交的文本。

+0

什么是-1?我不只是要求正则表达式的帮助,但我有我认为没有错误记录的合法技术问题,并且我至少已经完成了一些研究,如我所述...... – semmelbroesel

+1

您可以尝试PHP的filter_var()。 http://php.net/manual/en/function.filter-var.php我不知道它的速度。如果你知道这只是文本,那么其中一个ctypes也可能有帮助。也许这个正则表达式'[\^<> \} \ {\ |] +'会很有用。留下前导'^'和尾部'$'将使它只匹配符号,如果它们是匹配的短语的开始和结尾。 – asafreedman

+1

_“为什么它只是在没有任何通知的情况下停下来?”_这意味着你会造成一个致命的错误。定义error_reporting和error_log不是在你的脚本中,而是在更早的时候(.htaccess,webserver config,php.ini),它会记录它遇到的致命错误。 – Wrikken

回答

3

我尽量避免使用正则表达式。它太乱了。总有一个更好的方法。看看这个...

$chars = "^<>{}\|"; 
$text = "Testing bla di bla and more stupid text text text"; 
if(strpbrk($text, $chars) == false){ 
    echo 'Not Found'; 
} else { 
    echo 'char in text'; 
} 
+0

PHP有最古怪的函数名称... –

+0

@BrandonWamboldt它实际上只是从[一个C函数](http://pubs.opengroup.org/onlinepubs/009695299/functions/strpbrk.html)。 – Gumbo

+0

我喜欢不必使用preg_match这样的想法 - 我从来没有见过strpbrk,但它会非常有用!谢谢! – semmelbroesel

2

你的正则表达式是错误的,它也不是很清楚。这是做你想要什么更好的办法:

if (preg_match("/[<>}{\\|]/", "Testin{g bla di bla and more stupid text text text")) { 
    echo "Contains illegal characters!"; 
    exit; 
} 

在你的正则表达式,你需要躲避特殊字符\|。尽管如此,我的观点还是比较清楚。

+0

实际上,如果它位于'[括号]内',则不需要转义'|'。不伤害,但不是强制性的。只是在说。 ;) – jerdiggity

+0

@jerdiggity很高兴知道,我已经更新了我的答案。 –

1

我想也许你刚刚得到了+在错误的地方。试试这个:

preg_match("/^([^<>}{\\|]+)$/", "Testing bla di bla and more stupid text text text") 

简要说明:由于+意味着一个或多个以前的“东西”,你的代码告诉它来寻找一个或多个以前(group)+,而不是一个或多个的([^charactersNotHere]+)