Php 文本区域的preg_替换模式

Php 文本区域的preg_替换模式,php,regex,preg-replace,Php,Regex,Preg Replace,我只想只允许这个字符(在引号中使用)“a-z0-9.?!-”(最后一个字符是空格)。这是我的密码,但一定是出了什么问题。我试图检查文件,但我迷路了 $output = preg_replace('/![a-z0-9.!?-_ ]/i', '', $_POST['textarea']); 要对字符类求反,请执行以下操作: [^a-z0-9.!?_ -] 你所拥有的(之前的!)不是你如何否定它。还要注意,-应该转义,或者移到字符类的末尾,否则它有特殊的含义。这不是否定字符类的方式。请改用插入符号(

我只想只允许这个字符(在引号中使用)“a-z0-9.?!-”(最后一个字符是空格)。这是我的密码,但一定是出了什么问题。我试图检查文件,但我迷路了

$output = preg_replace('/![a-z0-9.!?-_ ]/i', '', $_POST['textarea']);

要对字符类求反,请执行以下操作:

[^a-z0-9.!?_ -]

你所拥有的(之前的
)不是你如何否定它。还要注意,
-
应该转义,或者移到字符类的末尾,否则它有特殊的含义。

这不是否定字符类的方式。请改用插入符号(
^

连字符在字符类中使用时表示一个范围,除非它是类中的最后一个字符、类中的第一个字符或直接在开头的否定插入符号(
^
)之后。在上面的正则表达式中,我已将连字符的位置更改为最后一个,但是,为了清晰起见,我建议使用反斜杠(
\^
)将其转义

$output = preg_replace('/[^a-z0-9.!?_ -]/i', '', $_POST['textarea']);