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

Posted

技术标签:

【中文标题】如何仅在 PHP 中限制某些特殊字符?【英文标题】:How can I restrict some special characters only in PHP? 【发布时间】:2014-10-06 12:52:56 【问题描述】:

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

【问题讨论】:

也许这会对你有所帮助。 ***.com/a/14114419/466082 我建议允许- 作为名字中的一个字符....你们不是都听说过Jean-Claude Van Damme 吗?虽然我想不出任何名字中包含数字的名字 【参考方案1】:

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

Ж☝ⓚƒ

您并不想将所有这些都列入黑名单。

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

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

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

【讨论】:

您可以为O'ConnorsJean-François 添加一些标点符号,如'- @M42:链接的文章很有帮助和娱乐性 - 阅读吧! 当然,我已经看过了,我只是说名字里可能有标点符号。 @M42:我明白了。问题是,如果我们开始添加标点,我们应该正确地执行此操作(禁止O'O'Connor 之类的内容),然后我们对结构的假设将变成错误的(他们会这样做),这是一个永无止境的故事。没有算法可以验证每个可能的人名。【参考方案2】:

你应该使用:

([%\$#\*]+)

匹配那些字符。

所以在preg_match 你应该使用:

if(preg_match("/([%\$#\*]+)/", $firstname))

   echo 'Invalid Name';

else

   echo $firstname;

【讨论】:

那么,(^_^;) 是一个有效的名称吗? @georg 当然不是,但 OP 只想限制选定的字符 看,您的代码与 OP 的代码完全不同,因为他(正确)列入了白名单,而您将其列入了黑名单。黑名单永远不会奏效。

以上是关于如何仅在 PHP 中限制某些特殊字符?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式仅允许某些特殊字符并限制下划线

如何限制材料输入中的特殊字符

必须包含数字、字母、特殊字符三种的正则?

如何限制在剑道网格输入栏中输入特殊字符

如何使用 Angular 2 / Typescript 限制输入字段中的特殊字符

Vue JS - 如何限制输入字段中的特殊字符?