Php 筛选URL时出错

Php 筛选URL时出错,php,validation,url,curl,Php,Validation,Url,Curl,问题已完全编辑 你好, 我正在使用以下代码验证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, '://ww

问题已完全编辑

你好,

我正在使用以下代码验证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。

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

我怀疑这个代码是否有效。由于您没有检查标识(
==
),因此该条件始终为真,因此在
www.
之前加上前缀。然而,这应该是可行的:

if (FALSE === strpos($url, '://www.'))
   $url = str_replace('://', '://www.', $url);
在这种情况下,不需要替换使用昂贵的正则表达式,因此应该使用


更新:问题已被编辑。我建议如下:

// 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']);

请注意,这可能会带来更多回报。您需要进行相应的重构。

s/substr/strps/
?另外,
ereg*
也不推荐使用。@goresplater,你能举个小例子吗?谢谢。@Eray No.您正在检查是否出现了“://www.”,如果没有,请插入此项。所以您需要检查是否返回
FALSE
(未找到)。@goresplater,非常感谢您现在使用此方法解决了问题。我能问点事吗?当
$url=“sdfsdf”
时,
$httpcode=curl\u getinfo($ch,CURLINFO\u HTTP\u code)返回200(OK),但正如您所看到的,sdfsfd不是URL。为什么它会返回200?@Eray。“看我最后一次对这个答案的评论。”戈雷斯普拉特,我们忘了什么。如果有子域,则不应添加www。我们怎样才能做到这一点?