PHP:正则表达式仅匹配数字、字母和一些特殊字符

7
我想使用正则表达式限制所允许的字符。也就是说:
a - z /* a to z */
A - Z /* A to Z */
0 - 9 /* 0 to 9 */
_ - /* underscore & dash */
~ ! @ # $% ^ & * () /* allowed special characters */

这是我的正则表达式函数:

function validChr($str) {
    return preg_match('/^[A-Za-z0-9_~\-!@#\$%\^&*\(\)]+$/',$str);
}

我实际上已经尝试过它并得到了我想要的结果,但我仍然不确定。我的正则表达式是否正确?还有其他形式的正则表达式吗?由于我对正则表达式还很新,请帮忙。谢谢。


3
没问题,但你应该添加一个转义符号来处理 *,因为它是通配符(在你的代码中表示字符串中没有或任意数量的 & 符号)。 - Rodion Baskakov
@RodionBaskakov 如果 * 在方括号中间,我相信你不需要转义它。 - Pigueiras
@RodionBaskakov:是想要这样写吗 preg_match('/^[A-Za-z0-9_~\-!@#\$%\^&\*\(\)]+$/',$str); - Fredy
@Fredy http://www.regexr.com ;) - Jelmer
2个回答

9

它的功能与预期相符。

您只需要在 * 前添加\进行转义。

这里可以查看:正则表达式测试


2
是的,但如果它在字符类中,则无需转义 * - Anirudha

1
你可以使用我之前制作的此函数来处理密码。通过修改if条件,你可以将其用于任何字符串。将每个特殊字符放在\前面。它还检查字符串长度是否为8-20个字符。
    function isPasswordValid($password){
            $whiteListed = "\$\@\#\^\|\!\~\=\+\-\_\.";
            $status = false;
            $message = "Password is invalid";
            $containsLetter  = preg_match('/[a-zA-Z]/', $password);
            $containsDigit   = preg_match('/\d/', $password);
            $containsSpecial = preg_match('/['.$whiteListed.']/', $password);
            $containsAnyOther = preg_match('/[^A-Za-z-\d'.$whiteListed.']/', $password);
            if (strlen($password) < 8 ) $message = "Password should be at least 8 characters long";
            else if (strlen($password) > 20 ) $message = "Password should be at maximum 20 characters long";
            else if(!$containsLetter) $message = "Password should contain at least one letter.";
            else if(!$containsDigit) $message = "Password should contain at least one number.";
            else if(!$containsSpecial) $message = "Password should contain at least one of these ".stripslashes( $whiteListed )." ";
            else if($containsAnyOther) $message = "Password should contain only the mentioned characters";
            else {
                $status = true;
                $message = "Password is valid";
            }
            return array(
                "status" => $status,
                "message" => $message
            );
    }

输出

$password = "asdasdasd"
print_r(isPasswordValid($password));
// [
//   "status"=>false,
//   "message" => "Password should contain at least one number."
//]

$password = "asdasd1$asd"
print_r(isPasswordValid($password));
// [
//   "status"=>true,
//   "message" => "Password is valid."
//]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接