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

当我链接到没有 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");
有帮助吗?

解决方案

这里不需要使用正则表达式。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 内置了很多方法来处理这些场景。

-马修

其他提示

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

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

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

请注意,两者之间存在真正的区别 www.site.comsite.com, ,通常两者都有效,但在某些网站上,每个网站都通向不同的路径(某些定义错误的网站如果没有 www 例如)。所以你不能总是在输入前面加上“www”。

另请注意,请处理前置空格,以便 ' http://' 不会在前面加上额外的 http://.

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

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

您可以验证客户端大小,只需将类似精神的代码放在 onSubmit 你的表格。

我会使用这样的东西:

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

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

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

if not "://" in users_url:
    users_url = "http://" + users_url

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

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

Regex exp = new Regex(
    @"http://(www\.)?([^\.]+)\.com",
    RegexOptions.IgnoreCase);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top