Preg_match 和百分号

Mor*_*sus 0 php regex sign preg-match

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

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

这是我的preg_match。我对这些代码有点陌生。我有红色,它最好#在结尾和开头使用,而不是/出于未知原因 xD 任何人都知道这是怎么回事?

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

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

谢谢 :)

anu*_*ava 5

这个 preg_match 实际上让带有“%”(百分号)的字符串通过,但它不应该。为什么?

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

'#[^0-9 -&()+@._A-Za-z]#'
--------^
Run Code Online (Sandbox Code Playgroud)

-充当从空间 (32) 到&(38) 的范围,因此匹配介于两者之间的任何内容,包括%(37)。

它应该用作:

'#[^-0-9 &()+@._A-Za-z]#'
Run Code Online (Sandbox Code Playgroud)

或者

'#[^-\w &()+@.]#'
Run Code Online (Sandbox Code Playgroud)

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

'#^[^-\w &()+@.]+$#'
Run Code Online (Sandbox Code Playgroud)

  • dat ascii 范围解释 tho &lt;3 (3认同)