if (!preg_match('/[^a-z ćčžđš\0-9]/i', $_POST['a'])) {
echo 'error';
}
我使用它只允许使用字母数字字符加上克罗地亚语的特定本地字符。
它可以工作,但它也允许逗号,指向...也许还有别的东西。 如何排除除a-z,我的本地字符,空格和数字之外的任何其他字符?
例如- 不应该被允许:
... 应该被允许:
答案 0 :(得分:2)
您的代码中存在3个问题:
1)要检查您的字符串是否包含禁用字符并显示错误消息,请使用双重否定:
if (!preg_match('/[^allowed characters]/i', ...
# ^--------------^
这意味着"如果字符串不包含禁用字符,则显示“''" 。
在我看来,正确的算法更多:
if ( preg_match('/[^allowed characters]/i', ...
2)如果在字符类中转义0-9中的0,则定义空字符和字符9 之间的范围(参见ascii表)
3)你正在处理unicode字符,你必须使用u修饰符,否则正则表达式引擎将逐字节读取你的字符串并返回误报:
if ( preg_match('/[^a-z ćčžđš0-9]/iu', $_POST['a']) )
echo 'error!';
要完成,重音字符可以用unicode以两种方式编写,例如č
可以是:
您的模式不会处理第二种情况。为避免此问题,您必须先使用intl normalizer对字符串进行规范化。
答案 1 :(得分:1)
您必须在正则表达式中删除“0-9”之前的反斜杠 你有双重否定,你可以添加“^”表示开头,“$”表示结束。 该 Unicode字符需要“u”修饰符
我已经改变了你的代码:
if (preg_match('/^[a-z ćčžđš0-9]*$/iu', $_POST['a'])) {
echo 'ok';
} else {
echo 'error';
}
我建议您使用在线正则表达式测试器测试您的正则表达式(例如https://regex101.com/)
答案 2 :(得分:1)
在0-9
之前使用反斜杠使其成为字符0和数字9(分别为索引0和57)之间范围内的字符组,而不是数字0和数字9.逗号(44)和一个点(46)巧合地在这个范围内,所以它并不像你需要的那样工作。
要使其正常工作,请删除斜杠:
[^a-z ćčžđš0-9]