完全编辑问题
您好,
我正在使用此代码验证网址:
$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 。
答案 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
可能会返回更多内容。你需要相应地重建。