php:preg_match因特殊字符模式而失败

时间:2015-07-10 19:21:18

标签: php regex

我有一个php正则表达式的问题。我在JS中有相同的正则表达式,它的工作原理。我不知道这是什么问题。

这是php代码正则表达式:

echo $password; // 9Gq!Q23Lne;<||.'/\
$reg_password = "/^[-_0-9a-záàâäãåçéèêëíìîïñóòôöõúùûüýÿæœÁÀÂÄÃÅÇÉÈÊËÍÌÎÏÑÓÒÔÖÕÚÙÛÜÝŸÆŒ0\d!@#$%^&*()_\+\{\}:\"<>?\|\[\];\',\.\/\x5c~]{6,30}$/i";
if(isset($password) &&
  (!preg_match($reg_password, $password) || !preg_match("#[a-z]#", $password) || !preg_match("#[\d]#", $password))
){
   echo "you failed";
 }

来自html输入的原始密码:

9Gq!Q23Lne;<||.\'/\  

它与$ reg_password之前的值相同。

我使用mysqli方法的escape_string进行测试,但它也不起作用:

$password = $this->db->escape_string($password);
echo $password; // 9Gq!Q23Lne;<||.\'/\\

我不知道我的问题是什么,因为我已经使用regex101.com来测试它并且它有效..

有什么想法吗? 感谢

2 个答案:

答案 0 :(得分:2)

在你的模式中,你需要使用单引号而不是double;)

所以它会像这样

$reg_password = '/^[-_0-9a-záàâäãåçéèêëíìîïñóòôöõúùûüýÿæœÁÀÂÄÃÅÇÉÈÊËÍÌÎÏÑÓÒÔÖÕÚÙÛÜÝŸÆŒ0\d!@#$%^&*()_\+\{\}:\"<>?\|\[\];\',\.\/\x5c~]{6,30}$/i';

答案 1 :(得分:0)

您无需多次致电preg_match,只需使用预测来强制执行您的规则,就像在此正则表达式中一样:

^(?=.*?\d)(?=.*?[a-z])[-\wáàâäãåçéèêëíìîïñóòôöõúùûüýÿæœÁÀÂÄÃÅÇÉÈÊËÍÌÎÏÑÓÒÔÖÕÚÙÛÜÝŸÆŒ0\d!@#$%^&*()+{}:"<>?|\[\];',./\x5c~]{6,30}$

RegEx Demo

<强>代码:

$re = "`^(?=.*?\\d)(?=.*?[a-z])[-\\wáàâäãåçéèêëíìîïñóòôöõúùûüýÿæœÁÀÂÄÃÅÇÉÈÊËÍÌÎÏÑÓÒÔÖÕÚÙÛÜÝŸÆŒ0\\d!@#$%^&*()+{}:\"<>?|\\[\\];',./\\x5c~]{6,30}$`mu";
$str = "9Gq!Q23Lne;<||.\'/\\"; 

if (!preg_match($re, $input)) {
   echo "you failed";
}