2

这就是问题所在:这行代码

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版本,想法是防止特殊字符被保存,所以我想检测它们的存在并拒绝提交的文本。

4

3 回答 3

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';
}
于 2013-10-16T18:26:14.663 回答
2

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

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

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

于 2013-10-16T18:26:24.640 回答
1

我想也许你只是+在错误的地方。试试这个:

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

简要说明:由于+表示一个或多个先前的“事物”,您的代码告诉它查找先前(group)+的一个或多个而不是一个或多个([^charactersNotHere]+).

于 2013-10-16T18:34:46.253 回答