题
我有人发布他们的网站地址,但发布了一些变体,例如:
- 他们的网站
- www.irsite.com
- http://theirsite.com
- http://www.irsite.com
当我链接到没有 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.com
和 site.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);
不隶属于 StackOverflow