2

我有这个 PHP 正则表达式:

$username = preg_replace('/[^a-z0-9]/i', '', $username);

它只允许A-Z0-9。我怎么能允许.-以及_

4

7 回答 7

9

您可以使用以下正则表达式:

/[^a-z0-9._-]/i
  • i 最后是使模式匹配不区分大小写。您可以删除它并使用:/[^a-zA-Z0-9._-]/
  • -(连字符)在 char 类中具有特殊含义,如果它被两边包围,所以我们把它放在最后,以便按字面意思对待它。你也可以这样做:/[^a-z0-9.\-_]/我们在哪里转义连字符
  • char 类中的点不是元字符,因此将按字面意思处理,无需转义。
于 2010-03-01T09:38:37.137 回答
2

很简单,只需将这些字符也添加到正则表达式中

$username = preg_replace('/[^a-zA-Z0-9._-]/','',$username)

这 。需要转义,因为它是“matchall”字符,最后是 - 因为否则它将用于定义范围(我们当然可以转义它)。

于 2010-03-01T09:40:59.597 回答
1
$username = preg_replace('/[^a-z0-9._-]/i', '', $username);

删除不属于( [^]) 组中字符之一的任何内容。注意 hypern 是最后一个,所以它失去了它的特殊含义。

于 2010-03-01T09:37:54.580 回答
1

如果您确切知道需要匹配什么,只需在字符组中指定它。破折号需要在最开始或最结束。

/[A-Z0-9._-]/
于 2010-03-01T09:38:18.240 回答
1
$username = preg_replace('/[^a-z0-9._-]/i', '', $username);

您当前的代码实际上确实允许A-Za-z-i标志将您的正则表达式标记为不区分大小写。

于 2010-03-01T09:38:25.400 回答
0
$username = preg_replace('/[^a-z0-9._-]/i', '', $username);
于 2010-03-01T09:38:37.007 回答
0

尝试

$username = preg_replace('/[^a-z0-9.-_]/i', '', $username);
于 2010-03-01T09:39:34.157 回答