문제
사람들이 웹 사이트 주소를 게시하지만 다음과 같은 변형이 게시됩니다.
- 그들의 site.com
- www.theirsite.com
- http://theirsite.com
- http://www.theirsite.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 Regex 기반 솔루션
'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을 구문 분석하려면 누락 된 부품을 확인하고 추가하십시오.
나는 약간의 검증이나 위생을 제공 할 것입니다. Regex를 사용하여 http : //가 시작하는지 확인하십시오. 그렇지 않은 경우, 유효성 검사 오류를 던지거나 시작에 http : //를 넣으십시오.
if not "://" in users_url:
users_url = "http://" + users_url
... 또는 당신이 선택한 언어로 동등합니다.
일반 표현식을 사용하여 입력을 테스트 할 수 있습니다
Regex exp = new Regex(
@"http://(www\.)?([^\.]+)\.com",
RegexOptions.IgnoreCase);