如何仅在PHP中限制某些特殊字符?
我使用preg_match来限制表单帖子中的特殊字符。现在我只需要限制一些特殊字符,比如如何仅在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'
%,$,#,*
,我需要像bé
一样发布。如何仅限制某些特殊字符
我的代码:
<?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的代码大不相同,因为他(正确地)是白名单,而你是黑名单。黑名单从来都不起作用。