如何仅在PHP中限制某些特殊字符?

时间:2014-08-13 08:29:34

标签: php regex validation preg-match pcre

我使用preg_match来限制表单帖子中的特殊字符。现在我需要限制一些特殊字符,例如%,$,#,*,我需要像一样发帖。如何才能限制某些特殊字符。

我的代码:

<?php
$firstname='';
if(isset($_POST['submit']))
{
    $firstname=$_POST['firstname'];
    if(preg_match("/[^a-zA-Z0-9]+/", $firstname))
    {
    echo 'Invalid Name';
    }
    else
    {
    echo $firstname;
    }

}
?>

<html>
<body>
<form method="post">
<input type="text" name="firstname"/>
<input type="submit" name="submit" value="Submit"/>
</form>
</body>
</html>

2 个答案:

答案 0 :(得分:3)

黑名单(=枚举无效的字符)不是unicode世界中的一个选项。例如,考虑一个像这样的“名称”:

Ж☝ⓚƒ

你真的不想将所有这些列入黑名单。

相反,白名单方法使用u模式和unicode属性非常简单:

var_dump(preg_match('/^[\p{L}\p{N}]+$/u', 'ßäßå'));  // 1
var_dump(preg_match('/^[\p{L}\p{N}]+$/u', 'r2d2'));  // 1
var_dump(preg_match('/^[\p{L}\p{N}]+$/u', 'w#t?'));  // 0
var_dump(preg_match('/^[\p{L}\p{N}]+$/u', 'Ж☝ⓚƒ'));  // 0

由于我们正在谈论验证真实姓名,请在开始复杂化之前先阅读Falsehoods Programmers Believe About Names

答案 1 :(得分:1)

您应该使用:

([%\$#\*]+)

匹配这些角色。

所以在preg_match你应该使用:

if(preg_match("/([%\$#\*]+)/", $firstname))
{
   echo 'Invalid Name';
}
else
{
   echo $firstname;
}