我有人发布他们的网站地址,但发布的变体如:
当我链接到没有http://的地址时,它将链接作为内部
<a href="theirsite.com">their site</a>
向人们发送类似:http://mysite.com/thiersite.com
的内容我尝试的另一个选项是链接到类似mysite.com/?link=theirsite.com的东西 - 这样我可以做一些链接跟踪等然后将人们重定向到链接但是它有同样的问题:
//do some tracking etc here
$link =$_GET['link'];
header("Location: $link");
答案 0 :(得分:8)
此处无需使用正则表达式。 PHP内置了URL验证。
var_dump((bool) filter_var('http://www.website.com', FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED));
var_dump((bool) filter_var('http://website.com', FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED));
var_dump((bool) filter_var('www.website.com', FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED));
var_dump((bool) filter_var('website.com', FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED));
输出
bool(true)
bool(true)
bool(false)
bool(false)
请不要直接跳到正则表达式进行验证,PHP内置了很多方法来处理这些场景。
-Mathew
答案 1 :(得分:2)
默认情况下在字段中输入“http://”,然后使用类似
的内容验证网址if(eregi("^((http|https)://)?([[:alnum:]-])+(\.)([[:alnum:]]){2,4}([[:alnum:]/+=%&_.~?-]*)$", stripslashes(trim($_POST['link'])))){
//link is valid
}
如果链接未验证,只需打印一条消息,说“您输入的链接无效,请确保以'http://'开头”
答案 2 :(得分:2)
我会用这样的东西:
$link = str_replace(array("\r", "\n"), '', trim($link));
if (!preg_match('/^https?:\/\//', $link)) {
$link = 'http://'.$link;
}
header('Location: '.$link);
另一种方法是parse_url
function解析给定的网址,查看缺少的部分并添加它们。
答案 3 :(得分:2)
请注意,www.site.com
和site.com
之间存在真正的差异,通常两者都有效,但在某些网站上每个都会导致不同的路径(如果没有{{{},某些定义不明确的网站将无效例如1}}。所以你不能总是在输入中加上'www'。
另一个注意事项是,处理预占空间,以便www
不会添加额外的' http://'
。
我的基于Javascript Regex的解决方案
http://
您可以验证客户端大小,只需在表单的'http://'+field.replace(/^ *http:\/\//,'')
上以类似的精神放置代码。
答案 4 :(得分:0)
我会提供一些验证或卫生。使用正则表达式来查看http://是否以它开头。如果没有,则抛出验证错误或将http://放在开头。
答案 5 :(得分:0)
if not "://" in users_url:
users_url = "http://" + users_url
...或等效的,用您选择的语言。
答案 6 :(得分:0)
您可以使用正则表达式来测试输入
Regex exp = new Regex(
@"http://(www\.)?([^\.]+)\.com",
RegexOptions.IgnoreCase);