PHP preg_match可以无错误地停止代码执行

时间:2013-10-16 18:12:51

标签: php regex

这是问题所在: 这行代码

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

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

原始代码不是我的,我对正则表达式并不擅长,但我的想法是检查文本中是否有以下任何特殊字符:

^ < > { } \ |

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

我有两个问题:

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

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

3 个答案:

答案 0 :(得分: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';
}

答案 1 :(得分:2)

你的正则表达式都是错误的,而且它也不是很清楚。这是做你想做的更好的方式:

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

在正则表达式中,您需要转义特殊字符\|。我的情况稍微清楚一点。

答案 2 :(得分:1)

我想也许你刚刚把+弄错了。试试这个:

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

简要说明:由于+表示以前的“事物”中的一个或多个,因此您的代码告诉它要查找之前的(group)+中的一个或多个一个或多个([^charactersNotHere]+)