preg_match,不包括逗号和点

时间:2017-09-29 15:54:20

标签: php preg-match

if (!preg_match('/[^a-z ćčžđš\0-9]/i', $_POST['a'])) {
    echo 'error';
}

我使用它只允许使用字母数字字符加上克罗地亚语的特定本地字符。

它可以工作,但它也允许逗号,指向...也许还有别的东西。 如何排除除a-z,我的本地字符,空格和数字之外的任何其他字符?

例如

- 不应该被允许:

  • ABC
  • ABC
  • ABC +

... 应该被允许:

  • ABC

3 个答案:

答案 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以两种方式编写,例如č可以是:

  • 单个代码点U + 010D(带有卡通的拉丁文小写字母C)
  • 代码点U + 0063(LATIN SMALL LETTER C)和代码点U + 030C(COMBINING CARON)的组合

您的模式不会处理第二种情况。为避免此问题,您必须先使用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]