如何使用html或php使用“http://”预填充type =“url”表单字段?

时间:2015-09-02 21:50:29

标签: php html forms

问题:在要求用户网站的表单上,type =“url”表单字段会返回错误,除非“http://”位于域名之前(甚至出现“ WWW“)。

结果我正在寻找:一种PHP / HTML *方法,用“http://”部分预填充type =“url”字段,这样用户输入的用户友好性更高“companywebsite.com”进入该领域并提交没有错误。

换句话说,用户只需填写companywebsite.com,我想用http://预先填写,最终结果为http://companywebsite.com

<h5>Website</h5>
<input type="url" name="company_website" id="company_website" value="" />


下图是返回错误的表单条目的屏幕截图(因为“http://”不在stackoverflow.com域之前)。

image of form error because "http://" wasn't in front of link

*我确实找到了一个.js方法(https://gist.github.com/cvan/117bc1f88e4dfca6dba7),但我是新手,只是学习php

2 个答案:

答案 0 :(得分:1)

有几种方法可以解决这个问题:

render @comment unless @comment.parent_class == Task

但是,我建议不要这样做,因为你永远不能相信用户输入正确。相反,假设您通过POST方法在PHP代码中提交表单,

<input type="url" name="company_website" id="company_website" value="http://" />

答案 1 :(得分:1)

那么好吧。为了学习安全性,我将用一些示例代码编写这个答案,这样你就知道将来如何安全地完成这些工作。

首先,让我们写一个小表格:

<form method="POST" action="your_php_file.php" accept-charset="utf-8">
    <input type="url" name="company_website" id="company_website" value="" />
    <input type="submit" value="Update website" />
</form>

现在让我们开始编写基于此的PHP文件。首先,我们需要确保用户提交新数据而不是空字符串:

if(isset($_POST['company_website']) && !empty($_POST['company_website'])){

接下来,我们将编写一个函数来检查字符串是否是网站:

function isWebsite($url){

要查看字符串是否与网站匹配,我们将使用正则表达式。正则表达式可能非常复杂,所以在这个答案的最后,我会发布一个链接来了解它们。

    $pattern = '#((https?|ftp)://(\S*?\.\S*?))([\s)\[\]{},;"\':<]|\.\s|$)#i';

现在让我们编写一个简单的if语句,返回true或false。为了简单起见,此语句将变量$url(包含用户数据)与$pattern中的上述正则表达式模式进行比较。如果$url包含有效网站,则返回true;如果不包含有效网站,则返回false。

    if(preg_match($pattern, $url)){
        return true;
    } else {
        return false;
    }
}

接下来,我们将编写一个添加&#39; http://&#39;在用户发送的数据前面:

function addHttp($url){
    $url = "http://". $url;
    return $url;
}

既然我们的功能已经完成,我们所要做的就是使用它们。首先,我们检查用户是否已发送有效网站:

if(isWebsite($_POST['company_website'])){
    //The website is valid, so you can safely add it your database here
    } else {
        //The website is not valid, but the user might simply have forgotten
        //to add http:// in front of it. So lets do it for him:
        $website = addHttp($_POST['company_website']);

        //Still we can't be sure if it's a valid website. It might be a string
        //that will try to mess with your database. So lets verify it again:
        if(isWebsite($website)){
            //The website is now valid, so you can safely add it your database here
        } else {
            //The website is still not valid, so we need to return an error
            //to your user:
            echo "It seems you didn't enter a valid website. Please try again!";
            exit;
        }
    }
}

您可能已经注意到,我们的代码中有两个位置,我们需要编写相同的代码来插入数据库中的所有内容。你也可以使用一个函数:

function addToDatabase($url){
    //Write your code to add everything to database here. $url will contain the website
}

所以完整的代码将变为如下:

<?php

if(isset($_POST['company_website']) && !empty($_POST['company_website'])){

    function isWebsite($url){
        $pattern = '#((https?|ftp)://(\S*?\.\S*?))([\s)\[\]{},;"\':<]|\.\s|$)#i';

        if(preg_match($pattern, $url)){
            return true;
        } else {
            return false;
        }
    }

    function addHttp($url){
        $url = "http://". $url;
        return $url;
    }

    function addToDatabase($url){
        //Write your code to add everything to database here. $url will contain the website
    }

    if(isWebsite($_POST['company_website'])){
        addToDatabase($_POST['company_website']);
    } else {
        //The website is not valid, try adding 'http://'
        $website = addHttp($_POST['company_website']);

        if(isWebsite($website)){
            addToDatabase($website);
        } else {
            //The website is still not valid, return error
            echo "It seems you didn't enter a valid website. Please try again!";
            exit;
        }
    }
}

?>

我应该补充说,盲目地将网站添加到您的数据库仍然可能不安全。为确保绝对安全,您需要将PDO()MySQLi()与准备好的语句结合使用。但在这个答案中解释说这会把它变成一本书。所以一定要了解它!

最后,我承诺提供一个资源,以了解有关正则表达式的更多信息。最好和最安全的资源来自官方PHP网站本身。您可以在此处找到它:PHP: Pattern Syntax