문제

사람들이 웹 사이트 주소를 게시하지만 다음과 같은 변형이 게시됩니다.

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

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);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top