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

如何仅在PHP中限制某些特殊字符?,php,regex,validation,preg-match,pcre,Php,Regex,Validation,Preg Match,Pcre,我使用preg_match来限制表单帖子中的特殊字符。现在我只需要限制一些特殊字符,比如%,$,#,*,我需要像bé一样发布。如何仅限制某些特殊字符 我的代码: <?php $firstname=''; if(isset($_POST['submit'])) { $firstname=$_POST['firstname']; if(preg_match("/[^a-zA-Z0-9]+/", $firstname)) { echo 'Invalid Name'

我使用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>

在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
由于我们讨论的是验证真名,请在开始复杂化之前阅读。

您应该使用:

([%\$\\*]+)
以匹配这些字符

因此,在
preg_match
中,您应该使用:

if(preg\u匹配(“/([%\$\\*]+)/”,$firstname))
{
回显“无效名称”;
}
其他的
{
echo$firstname;
}

也许这会对您有所帮助。我建议允许将
-
作为名字中的字符。。。。你不是听说过让·克劳德·范达姆吗?虽然我想不出任何名字上面有数字,但你可以为
O'Connors
Jean François
@M42添加一些标点符号,如
'
-
:链接的文章非常有帮助,也很有趣-阅读!当然,我已经读过了,我只是说它的名字里可能有标点符号。@M42:我明白了。问题是,如果我们开始添加穿刺,我们应该正确地这样做(不允许像
O'O'Connor
这样的事情),然后我们对结构的假设就会出错(他们会这样做),这是一个永无止境的故事。没有算法来验证每个可能的人名。因此,
(^ ^;)
是一个有效的名字吗?@georg当然不是,但OP只想限制选定的字符。好吧,你的代码与OP的代码大不相同,因为他(正确地)是白名单,而你是黑名单。黑名单从来都不起作用。