3

我有一个快速的正则表达式问题,我想有人可能会不自觉地知道。如果我只想允许上/下字母数字、空格、标点符号和引号,那么用于 CakePHP 验证的正则表达式是什么?这就是我所拥有的,但它已关闭:

 'rule' => array('custom', '/[a-z0-9\x20\x21\x2E\x3A\x3B\x3F\x2C\x27\x22]{0,600}/i'),

据我所知, a-z0-9 覆盖字母数字,但 \xXX 不应该用 ASCII 十六进制代码覆盖标点符号吗?然后{0,600]表示0-600个字符的长度,i表示上下。我错过了什么?

例如:valid:这是一个“有效文本”,包含'和标点符号!

无效:这是一个明显的 XSS 尝试

4

2 回答 2

3
^([\d\w\s?!\.;:,'"\/\[\]\(\)=\+-]*)$

应该管用?您应该提供您认为有效和无效的文本示例。

preg_match('/^([\d\w\s?!\.;:,'"\/\[\]\(\)=\+-]*)$/', $string);
于 2012-04-20T05:26:08.447 回答
1

只要您知道您希望它是 ASCII,只需使用字符范围

$input = "this is a \n string\n";
echo preg_match("/^[ -~]{0,600}$/", $input);  // output is 0 (false)
$input = "this is a string";
echo preg_match("/^[ -~]{0,600}$/", $input);  // output is 1 (true)

每当我处理 ASCII 时,我发现特定范围要容易得多。所以基本上你希望字符串的开头是空格和 ~ 中的任何内容,它们都是可见字符。然后你有 0-600 个字符的限制,$ 表示字符串的结尾

于 2012-04-20T08:16:46.453 回答