Вопрос

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

Когда я ссылаюсь на адрес без 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-адрес, посмотреть, каких частей не хватает, и добавить их.

Я бы предоставил некоторую проверку или санацию.Используйте регулярное выражение, чтобы увидеть, начинается ли с него 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