1

我有人发布他们的网站地址,但发布了变体,例如:

当我链接到没有 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");
4

7 回答 7

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 内置了很多方法来处理这些场景。

-马修

于 2009-04-29T14:43:12.550 回答
2

默认情况下将“http://”放在字段中,然后使用类似的内容验证 URL

if(eregi("^((http|https)://)?([[:alnum:]-])+(\.)([[:alnum:]]){2,4}([[:alnum:]/+=%&_.~?-]*)$", stripslashes(trim($_POST['link'])))){
    //link is valid
}

如果链接无效,只需打印一条消息“您输入的链接无效,请确保它以'http://'开头”

于 2009-04-29T14:02:12.337 回答
2

我会使用这样的东西:

$link = str_replace(array("\r", "\n"), '', trim($link));
if (!preg_match('/^https?:\/\//', $link)) {
    $link = 'http://'.$link;
}
header('Location: '.$link);

另一种方法是解析给定 URL 的parse_url函数,查看缺少哪些部分并添加它们。

于 2009-04-29T14:05:41.830 回答
2

www.site.com请注意,和之间存在真正的区别site.com,通常两者都有效,但是在某些网站上,每个网站都会导致不同的路径(例如,某些定义不正确的网站将无法正常工作www)。所以你不能总是在输入前加上“www”。

另一个注意事项,请处理前置空间,这样' http://'就不会在前面加上额外http://的 .

我的基于 Javascript 正则表达式的解决方案

'http://'+field.replace(/^ *http:\/\//,'')

您可以验证客户端大小,只需在onSubmit表单上添加类似精神的代码。

于 2009-04-29T14:07:05.553 回答
0

我会提供一些验证或卫生。使用正则表达式查看 http:// 是否以它开头。如果不是,则抛出验证错误或将 http:// 放在开头。

于 2009-04-29T13:57:08.777 回答
0
if not "://" in users_url:
    users_url = "http://" + users_url

...或同等语言,使用您选择的语言。

于 2009-04-29T13:57:53.673 回答
0

您可以使用正则表达式来测试输入

Regex exp = new Regex(
    @"http://(www\.)?([^\.]+)\.com",
    RegexOptions.IgnoreCase);
于 2009-04-29T13:58:02.050 回答