编辑表格以清理/验证电话号码

Posted

技术标签:

【中文标题】编辑表格以清理/验证电话号码【英文标题】:Editing form to sanitize/validate phone number 【发布时间】:2013-04-05 09:53:30 【问题描述】:

我在 php 方面的经验非常有限,我真的希望有人可以帮助我。

我想做的是清理/验证电话号码输入,以便只允许输入数字。

我想我需要使用FILTER_SANITIZE_NUMBER_INT,但我不确定在哪里或如何使用它。

这是我的代码:

<?php

// Replace the email address with the one that should receive the contact form inquiries.
define('TO_EMAIL', '########');

$aErrors = array();
$aResults = array();

/* Functions */

function stripslashes_if_required($sContent) 

    if(get_magic_quotes_gpc()) 
        return stripslashes($sContent);
     else 
        return $sContent;
    


function get_current_url_path() 

    $sPageUrl = "http://".$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
    $count = strlen(basename($sPageUrl));
    $sPagePath = substr($sPageUrl,0, -$count);
    return $sPagePath;


function output($aErrors = array(), $aResults = array()) // Output JSON

    $bFormSent = empty($aErrors) ? true : false;
    $aCombinedData = array(
        'bFormSent' => $bFormSent,
        'aErrors' => $aErrors,
        'aResults' => $aResults
        );

    header('Content-type: application/json');
    echo json_encode($aCombinedData);
    exit;


// Check supported version of PHP
if (version_compare(PHP_VERSION, '5.2.0', '<'))  // PHP 5.2 is required for the safety filters used in this script

    $aErrors[] = 'Unsupported PHP version. <br /><em>Minimum requirement is 5.2.<br />Your version is '. PHP_VERSION .'.</em>';
    output($aErrors);



if (!empty($_POST))  // Form posted?

    // Get a safe-sanitized version of the posted data
    $sFromEmail = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
    $sFromName = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW);

    $sMessage  = "Name: ".stripslashes_if_required($_POST['name']);
    $sMessage .= "\r\nEmail: ".stripslashes_if_required($_POST['email']);
    $sMessage .= "\r\nBusiness: ".stripslashes_if_required($_POST['business']); 
    $sMessage .= "\r\nAddress: ".stripslashes_if_required($_POST['address']);
    $sMessage .= "\r\nPhone: ".stripslashes_if_required($_POST['phone']);
    $sMessage .= "\r\nMessage: ".stripslashes_if_required($_POST['message']);
    $sMessage .= "\r\n--\r\nEmail sent from ". get_current_url_path();

    $sHeaders  = "From: '$sFromName' <$sFromEmail>"."\r\n";
    $sHeaders .= "Reply-To: '$sFromName' <$sFromEmail>";

    if (filter_var($sFromEmail, FILTER_VALIDATE_EMAIL))  // Valid email format?

        $bMailSent = mail(TO_EMAIL, "New inquiry from $sFromName", $sMessage, $sHeaders);
        if ($bMailSent) 
            $aResults[] = "Message sent, thank you!";
         else 
            $aErrors[] = "Message not sent, please try again later.";
        

     else 
        $aErrors[] = 'Invalid email address.';
    
 else  // Nothing posted
    $aErrors[] = 'Empty data submited.';



output($aErrors, $aResults);

【问题讨论】:

见上一篇文章:***.com/questions/3090862/…,还有这篇文章的各种格式:***.com/questions/123559/… 【参考方案1】:

您是否研究过 PHP 的 preg_replace 函数?您可以使用preg_replace('/[^0-9]/', '', $_POST['phone']) 去除任何非数字字符。

过滤掉字符数据后,您可以随时检查它是否具有所需的长度:

$phone = preg_replace('/[^0-9]/', '', $_POST['phone']);
if(strlen($phone) === 10) 
    //Phone is 10 characters in length (###) ###-####

您还可以使用 PHP 的 preg_match 函数,如 this other SO question. 中所述

【讨论】:

我已将$sMessage .= "\r\nPhone: ".stripslashes_if_required($_POST['phone']); 更改为$sMessage .= "\r\nPhone: ".preg_replace('/[^0-9+-]/', '', $_POST['phone']); 。这是一个好的方法吗?它似乎工作得很好。 @user2275638 如果您的目标是只允许 0-9 和 +/- 符号,那么可以。它将删除 $_POST['phone'] 中不是数字或 +/- 符号的所有内容。 你可能也应该允许 () :preg_replace("|(?mi-Us)[^0-9 \\-\\(\\)\\+\\/]|", '', $_REQUEST['phone']) @snotwaffle 你的表达可能有问题。当我尝试它时,它只会给我原来的电话号码。此外,当您确定电话号码的长度是否为 10 个字符时,() 不应计算在内。如果我允许(),那么用户可以输入 12345678() 并通过验证。 我对正则表达式不太感兴趣,所以我不知道如何制作一个正则表达式,强制括号在前面,它们之间有一个或多个数字(在可选的国际之后拨号代码),但这就是他们应该在哪里/他们应该如何工作。也许来自html5pattern.com/Phones 的东西会满足您的需求。【参考方案2】:

有几种方法可以做到这一点......示例:

// If you want to clean the variable so that only + - . and 0-9 can be in it you can:
$number = filter_var($number, FILTER_SANITIZE_NUMBER_INT);

// If you want to clean it up manually you can:
$phone = preg_replace('/[^0-9+-]/', '', $_POST['phone']);

// If you want to check the length of the phone number and that it's valid you can:
if(strlen($_POST['phone']) === 10) 
    if (!preg_match('/^[0-9-+]$/',$var))  // error  else  // good 

显然,可能需要根据国家/地区和其他杂项因素进行一些修改。

【讨论】:

【参考方案3】:

您可以尝试使用 preg_replace 过滤掉任何非数字字符,然后您可以检查剩余内容的长度以查看其是否为电话号码(应该是 7,9 或 10 位数字)

// remove anything thats not a number from the string
function only_numbers($number)  return preg_replace('/[^0-9]/', '', $number) ;
// test that the string is only 9 numbers long
function isPhone($number)  return strlen(only_numbers($number)) == 9; 

在验证后使用值时,请确保使用only_numbers 值。

-肯

【讨论】:

你不需要做一个函数来检查一个字符串是不是一个数字;使用 PHP 内置的is_numeric()。它适用于浮点数和整数(包括有符号数)。但是,它允许在浮点数中使用“e”/“E”。带有FILTER_SANITIZE_INT 参数的filter_var() 可以工作。

以上是关于编辑表格以清理/验证电话号码的主要内容,如果未能解决你的问题,请参考以下文章

将此转换为验证表达式驾驶执照号码

集成 FirebasePhoneAuthUI 以进行电话号码身份验证

以编程方式编辑联系人的姓名/电话号码

用于以特定顺序验证电话号码的正则表达式

js正则表达式电话号码验证

C# - 使用正则表达式验证电话号码