过滤URL时出错

时间:2011-01-24 10:34:04

标签: php validation url curl

完全编辑问题

您好,

我正在使用此代码验证网址:

$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 个答案:

答案 0 :(得分:2)

我认为,substr实际上应该是strpos

我怀疑这段代码是否有效。由于您没有检查身份(===),因此条件始终为true,因此在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可能会返回更多内容。你需要相应地重建。