Ошибка при фильтрации URL - PullRequest
       5

Ошибка при фильтрации URL

0 голосов
/ 24 января 2011

ВОПРОС РЕДАКТОР ПОЛНОСТЬЮ

Здравствуйте,

Я использую этот код для проверки URL:

$url = preg_replace("/[^A-Za-z0-9-\/\.\:]/", "", trim($url)); // clean invalid chars and space
$url = preg_replace('%^(?!https?://).*%', 'http://$0', $url); // add HTTP:// , if there isn't
if (FALSE === strpos($url, '://www.')) // if there isn't WWW
{
    $url = str_replace('://', '://www.', $url); // add WWW
}

Но есть проблема. Если $ url имеет поддомен (например, http://blog.example.com), этот код все еще добавляет www (http://www.blog.example.com).

Как я могу это исправить? Если есть поддомен, не добавить www .

1 Ответ

2 голосов
/ 24 января 2011

Я думаю, substr на самом деле должно быть strpos?

Я сомневаюсь, что этот код когда-либо работал. Поскольку вы не проверяете личность (===), условие всегда выполняется, поэтому предваряется www.. Это должно работать, однако:

if (FALSE === strpos($url, '://www.'))
   $url = str_replace('://', '://www.', $url);

Нет необходимости заменять дорогостоящие регулярные выражения в этом случае, поэтому вы должны использовать str_replace.


ОБНОВЛЕНИЕ: Вопрос был отредактирован. Я предлагаю следующее:

// Strip "invalid" characters
$url = preg_replace('/[^a-z0-9\.\-]/i', '', $url);

// Split URL by scheme, host, path (and possibly more)
$parts = parse_url($domain);

if (empty($parts['scheme']))
   $parts['scheme'] = 'http';
if (!strcmp('example.com', $parts['host']))
   $parts['host'] = 'www.example.com';

// Reconstruct URL
$url = sprintf('%s://%s%s', $parts['scheme'], $parts['host'], $parts['path']);

Имейте в виду, что parse_url может вернуть намного больше. Вам нужно будет восстановить соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...