【问题标题】:How to validate name field to avoid numbers如何验证名称字段以避免数字
【发布时间】:2017-04-17 09:35:59
【问题描述】:

如何使用 bootstrap 或 php 轻松验证表单上输入的名称?我希望此字段拒绝所有数字 0-9。你能帮帮我吗?

这是字段,它是我使用的表单的一部分:

<input class="form-control" id="name" placeholder="NAME" type="text" name="name">

这是发送表单的 php 脚本:

<?php
 $adresdo = "info@takelake.com";
  $temat = "Newsletter signup";
  $zawartosc = "Imie: ".$_POST['name']."\n"
       ."Email: ".$_POST['email']."\n"
       ."Selected".implode($_POST['checkbox'],",");

// if the url field is empty 
if(isset($_POST['url']) && $_POST['url'] == ''){

  if(!$_POST['name'] || !$_POST['email']){
     header("Location: error.html");
   exit;
}
$email = $_POST['email'];
if(mail($adresdo, $temat, $zawartosc, 'From: Subskrybent <'.$email.'>'))
{
   header("Location: ok.html"); 
}


} 

   header("Location: error.html");
  ?>

【问题讨论】:

  • 我不是很擅长 php,所以如果你能帮助我修改代码,我将不胜感激。谢谢
  • 你想在哪里验证 - 通过 php 或 javascript ?
  • javascript 可能很有用。它可以是普通的javascript而不是jquery吗?或者 jquery 很好。请注意,如果有帮助,我在这里使用引导程序

标签: php forms validation spam spam-prevention


【解决方案1】:

您可以为此使用 html5 代码,这将留出空间,如果您想检查至少 2 个字符,请使用 [a-zA-Z][a-zA-Z ]{2,} 或使用 [a-zA-Z][a-zA-Z ]{1,}

<input type="text" name="name" pattern="[a-zA-Z][a-zA-Z ]{2,}" required>

这不允许空间

 <input type="text" name="name" pattern="[a-zA-Z]{1,}" required>

更多信息

https://www.w3schools.com/tags/att_input_pattern.asp

这是 php 验证

<?php
$adresdo = "info@takelake.com";
$temat = "Newsletter signup";
$zawartosc = "Imie: " . $_POST['name'] . "\n"
    . "Email: " . $_POST['email'] . "\n"
    . "Selected" . implode($_POST['checkbox'], ",");

// if the url field is empty
if (isset($_POST['url']) && $_POST['url'] == '') {
    // then send the form to your email
    mail('you@yoursite.com', 'Contact Form', print_r($_POST, true));

    if (!$_POST['name'] || !$_POST['email']) {
        header("Location: error.html");
    }
    if (preg_match('~[0-9]~', $_POST['name'])) {
        header("Location: error.html");
        exit();
    }

    $email = $_POST['email'];
    if (mail($adresdo, $temat, $zawartosc, 'From: Subskrybent <' . $email . '>')) {
        header("Location: ok.html");
    }
}

【讨论】:

  • 这(HTML 中的模式)将拒绝合法字符,如空格和重音字母、连字符和撇号——它们是名称中的合法字符。正则表达式检查器应该是包容性的,而不是排他性的。
  • 为什么不改用[^0-9]+?这是数字独有的。 +{1,} 相同
  • 另外需要注意的是,输入标签中的 HTML 模式属性在 IE9 或 Safari 中是不支持的。
  • 我已经添加了更多信息的链接和这个解决方案,我已经提供了其他解决方案。 @mwieczorek
  • 是的,你做到了。但是,仅说明解决方案的任何缺点是公平的,以防将来有人不费心点击链接。
【解决方案2】:

pattern="[A-Za-z]" 其默认属性为html&lt;input class="form-control" id="name" placeholder="NAME" type="text" pattern="^\D*$" name="name" title="Number Not Allowed"&gt;

【讨论】:

  • 这将拒绝合法字符,如空格和重音字母、连字符和撇号——它们是名称中的合法字符。正则表达式检查器应该是包容性的,而不是排他性的。
【解决方案3】:

要在 PHP 中检查字符串是否有数字,正则表达式是要走的路:

if (preg_match('/[0-9]+/', $_POST['field_name'])) {
    // add logic if the POST value has numbers in it...
}

如果您想将其重用于其他操作,或者将其包装在一个函数中:

function containsNumbers($string) {
    return preg_match('/[0-9]+/', $string) > 0;
}

像这样使用:

if (containsNumbers($_POST['field_name'])) {
    // logic here
}

不要只依赖前端验证。这就是后端的用途。 HTML 输入模式和 javascript 验证可以很容易地绕过。最佳做法是通过 Javascript 检查前端以获得更好的 UI 响应,但通过 PHP 重新检查后端以防用户试图规避规则。

这是 Javascript 中的检查器:

var checkIsValidName = function(string) {
    // returns false if string contains numbers
    var pattern = /[^0-9]+/;

    // returns false if string contains chars other than A-Z, a-z, space, apostraphe and hyphen
    // also returns false on accented characters, as this checks the ASCII values
    var pattern = /[A-Za-z\s\'-]/;

    return string.match(pattern);
}

用法:

if (checkIsValidName()) {
    // javascript logic here
    alert('Not Valid Name');
}

此正则表达式模式将匹配所有字母、空格、连字符、撇号和标准重音字符(西欧):

[A-Za-z\s\'-ßàáâãäåæçèéêëìíîïðñòóôõöøùúûüý]

您会发现这很快就会变得一团糟,如果字符串包含我们不包含的任何非 ASCII 字母,例如西里尔文、波兰语和任何亚洲字母字符,它将拒绝该字符串。

因为如果是这样,最好是 exclusive 而不是 inclusive 进行正则表达式检查,因为总会有更多您允许的字符而不是您不允许的字符。当然,这指的是人们的姓名,而不是密码或电子邮件地址,您希望在其中使用包容性模式(因为您实际可以使用的字符是有限的)。

注意:虽然有用且看似简单,但在输入标签中使用 HTML5 pattern 属性并不安全,因为 IE9 和 Safari 不支持此功能。

最好通过 javascript 检查快速响应的 UI,而不是阻止大多数错误输入,但您始终应该让 PHP 后端处理最终验证 - 确保用户的输入是保留,因此他们不必多次输入信息,保存以进行编辑。

将 AJAX 与 JavaScript 和 PHP 结合使用,以获得最佳的数据结果和用户体验。

【讨论】:

    【解决方案4】:

    使用以下代码检查是否包含数字:

    if(preg_match('~[0-9]~', $_POST['name'])) {
        //has numbers
    } else {
       //no numbers
    }
    

    更新了你的代码:

    <?php
    $adresdo = "info@takelake.com";
    $temat = "Newsletter signup";
    $zawartosc = "Imie: ".$_POST['name']."\n"
       ."Email: ".$_POST['email']."\n"
       ."Selected".implode($_POST['checkbox'],",");
    
    // if the url field is empty 
    if(isset($_POST['url']) && $_POST['url'] == ''){
     // then send the form to your email
      mail( 'you@yoursite.com', 'Contact Form', print_r($_POST,true) ); 
    
      if(!$_POST['name'] || !$_POST['email']){
         header("Location: error.html");
       exit;
        if(preg_match('~[0-9]~', $_POST['name'])) {
            header("Location: error.html");
            exit();
        } 
    }
    $email = $_POST['email'];
    if(mail($adresdo, $temat, $zawartosc, 'From: Subskrybent <'.$email.'>'))
    {
        header("Location: ok.html");
        exit(); 
    }
    
    
    } 
    
       header("Location: error.html");
       exit();
      ?>
    

    【讨论】:

    • 谢谢 shr3jn。你能看看我的代码并通过添加你的代码来修改它吗?我不擅长 php。谢谢
    • 这几乎可以工作了。它会发送消息以防万一,但它会显示错误页面。即使消息经过验证并发送。
    • @PiotrCiszewski exit() 已添加到发送的邮件中。
    • 恐怕还是一样。现在即使名称中包含数字,它也会将我带到 OK 页面。
    猜你喜欢
    • 1970-01-01
    • 2016-03-16
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 1970-01-01
    相关资源
    最近更新 更多