从PHP字符串中删除不是a-zA-Z0-9,_和 - 的字符

Jos*_*osh 2 php regex preg-replace

我想要阻止所有与这个正则表达式模式不匹配的字符:[a-zA-Z0-9_-].

通常我会这样做:

preg_replace("[a-zA-Z0-9_-]", "", $var);
Run Code Online (Sandbox Code Playgroud)

但显然这对我想要的东西产生了相反的效果.正则表达式中是否有NOT?我怎样才能删除任何与模式不匹配的字符?

谢谢.

net*_*der 8

这个:

preg_replace("[a-zA-Z0-9_-]", "", $var);
Run Code Online (Sandbox Code Playgroud)

除非输入字符串恰好是模式,否则甚至不会替换这些字符.通过使用[]as分隔符,它们与表达式本身的效果不同.您可以更改分隔符(例如:) /,或在模式中添加更多括号:

preg_replace("/[a-zA-Z0-9_-]/", "", $var);    // this works
preg_replace("[[a-zA-Z0-9_-]]", "", $var);    // this too
Run Code Online (Sandbox Code Playgroud)

现在,否定的模式[],您使用^的开头:

preg_replace("/[^a-zA-Z0-9_-]/", "", $var);
Run Code Online (Sandbox Code Playgroud)

您还可以使用不敏感修饰符i来匹配lowercase(a-z)和uppercase(A-Z):

preg_replace("/[^a-z0-9_-]/i", "", $var);   // same as above
Run Code Online (Sandbox Code Playgroud)