Preg_match 和百分号

Preg_match and percent sign

我对 php 中的 preg_match 有几个问题。

if(preg_match('#[^0-9 -&()+@._A-Za-z]#', $input)){
    $errors .= 'Sorry, username can\'t contain those characters.<br>';
}

这是我的preg_match。我对这些代码有点陌生。我有红色的是,由于未知原因,在结尾和开头使用 #/ 更好 xD 有人知道这是怎么回事吗?

我的主要问题是这个 preg_match 实际上让带有 %(百分号)的字符串通过,但它不应该。为什么?以及如何阻止它?

另一个问题是这个preg_match代码好吗? 它工作正常(除了 % 部分)但它会失败吗?

谢谢:)

this preg_match actually let strings with "%" (percent signs) through and it shouldn't. Why?

这是由于正则表达式中间的未转义连字符所致:

'#[^0-9 -&()+@._A-Za-z]#'
--------^

- 的作用范围从 space (32) 到 & (38),因此匹配介于两者之间的任何内容,包括 % ( 37).

应该用作:

'#[^-0-9 &()+@._A-Za-z]#'

'#[^-\w &()+@.]#'

然而,如果没有锚点,这个字符 class 将只匹配一个字符。你应该使用:

'#^[^-\w &()+@.]+$#'