Убедиться, что http появляется в веб-адресе - PullRequest
1 голос
/ 29 апреля 2009

У меня есть люди, публикующие адрес своего сайта, но публикуются варианты, такие как:

Когда я ссылаюсь на адрес без 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");

Ответы [ 7 ]

8 голосов
/ 29 апреля 2009

Нет необходимости использовать регулярные выражения здесь. В 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 много встроенных методов для работы с этими сценариями.

-Mathew

2 голосов
/ 29 апреля 2009

Обратите внимание, что между www.site.com и site.com существует реальная разница, обычно оба работают, но на некоторых веб-сайтах каждый ведет по своему пути (некоторые плохо определенные веб-сайты не будут работать без www, например) , Таким образом, вы не всегда можете добавить 'www' к вводу.

Еще одно примечание: обработайте предварительно добавленное пространство, чтобы к ' http://' не добавлялся дополнительный http://.

Решение на основе Javascript Regex

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

Вы можете проверить это по размеру клиента, просто поместив код в аналогичном духе в onSubmit вашей формы.

2 голосов
/ 29 апреля 2009

Я бы использовал что-то вроде этого:

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

Другим способом будет parse_url функция , чтобы проанализировать данный URL, посмотреть, какие части отсутствуют, и добавить их.

2 голосов
/ 29 апреля 2009

поставить "http://"" в поле по умолчанию, затем подтвердить URL-адрес чем-то вроде

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

если ссылка не проверяется, просто распечатайте сообщение о том, что "введенная вами ссылка недействительна, убедитесь, что она начинается с 'http://'"

0 голосов
/ 29 апреля 2009

Вы можете использовать регулярные выражения для проверки ввода

Regex exp = new Regex(
    @"http://(www\.)?([^\.]+)\.com",
    RegexOptions.IgnoreCase);
0 голосов
/ 29 апреля 2009
if not "://" in users_url:
    users_url = "http://" + users_url

... или эквивалентный на выбранном вами языке.

0 голосов
/ 29 апреля 2009

Я бы предоставил некоторую проверку или санитарию. Используйте регулярное выражение, чтобы увидеть, начинается ли http: // с него. Если этого не произойдет, либо сгенерируйте ошибку проверки, либо поместите http: // в начало.

...