in realtà la regexp lavora giusto, perchè mi controlla che ci sia almeno uno dei caratteri, ma non blocca se ci sono caratteri diversi!! 
forse così dovrebbe funzionare
Codice PHP:
function a($pass=false)
{
$r=new stderror();
if($pass==false){return false;}
if(isset($pass) && preg_match("/((?=.*[a-z])(?=.*[A-Z])(?=.*[\.\+\$@!_])(?=.*[0-9]).{4})[a-zA-Z\.\+\$@!_0-9]{4,16}/",$pass,$pw))
{
return ($pw[0]==$pass)?true:false;
}
else
{return false;}
}
var_dump(a("347ri.,124Ae"),"347ri.,124Ae");
echo "
";
var_dump(a("347ri.#124Ae"),"347ri.#124Ae");
echo "
";
var_dump(a("347ri.124Ae"),"347ri.124Ae");
echo "
";
var_dump(a("aaaa1aAb+bbb"),"aaaa1aAb+bbb");
echo "
";
var_dump(a("a1Ab+11"),"a1Ab+11");
echo "
";
var_dump(a("a1Ab+118901234567890"),"a1Ab+118901234567890");
echo "
";
var_dump(a("a1Ab+1189012345678901"),"a1Ab+1189012345678901");
echo "
";
stamperà
codice:
bool(false) string(12) "347ri.,124Ae"
bool(false) string(12) "347ri.#124Ae"
bool(true) string(11) "347ri.124Ae"
bool(true) string(12) "aaaa1aAb+bbb"
bool(false) string(7) "a1Ab+11"
bool(true) string(20) "a1Ab+118901234567890"
bool(false) string(21) "a1Ab+1189012345678901"