问题:在要求用户网站的表单上,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域之前)。
*我确实找到了一个.js方法(https://gist.github.com/cvan/117bc1f88e4dfca6dba7),但我是新手,只是学习php
答案 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