如果url字符串没有www,如何预先添加www?

时间:2015-06-08 17:40:10

标签: php url web

在我的网站中,我有一个表单,其中有一个URL输入字段,因此我想检查用户何时输入url,如以下组合http://example.com或www.example.com或example.com。但我想将http://www.example.com存储在我的数据库中。如何使用PHP而不是使用.htaccess或jquery或javascript验证。

        //TrainingDialog associated with save button
        trainingDialog = new MessageDialog("trainingdialog", "Warning", "Message contents here",
                DialogButtons.OK, DialogIcon.WARN) {
            public void onClose(AjaxRequestTarget target, DialogButton button) {
                if (button != null && button.match(LBL_OK)) {
                    target.prependJavaScript("return saveClick()");
                    saveButton.add(new AttributeModifier("onclick", "return saveClick()"));
                    target.add(saveButton);
                    //note: predefined button text are:
                    //LBL_OK, LBL_CANCEL, LBL_YES, LBL_NO, LBL_CLOSE, LBL_SUBMIT
                }
            }
        }; 


        add(trainingDialog);

以下代码检查了网址验证

// Check, if not have http:// or https:// then prepend it
if (!preg_match('#^http(s)?://#', $url))
{
$url = 'http://' . $url;
} 

3 个答案:

答案 0 :(得分:1)

关注此page以及thomas发布的代码:

<?php 

$url = 'http://usr:pss@example.com:81/mypath/myfile.html?a=b&b[]=2&b[]=3#myfragment'; 
print append_www_to_host($url); 

function append_www_to_host($url) {
  $parsed_url = url_parse($url); 
  $scheme   = isset($parsed_url['scheme']) ? $parsed_url['scheme'] . '://' : 'http://'; 
  $host     = isset($parsed_url['host']) ? startsWith($parsed_url['host'], 'www.') ? $parsed_url['host'] : 'www.' . $parsed_url['host'] : ''; 
  $port     = isset($parsed_url['port']) ? ':' . $parsed_url['port'] : ''; 
  $user     = isset($parsed_url['user']) ? $parsed_url['user'] : ''; 
  $pass     = isset($parsed_url['pass']) ? ':' . $parsed_url['pass']  : ''; 
  $pass     = ($user || $pass) ? "$pass@" : ''; 
  $path     = isset($parsed_url['path']) ? $parsed_url['path'] : ''; 
  $query    = isset($parsed_url['query']) ? '?' . $parsed_url['query'] : ''; 
  $fragment = isset($parsed_url['fragment']) ? '#' . $parsed_url['fragment'] : ''; 
  return "$scheme$user$pass$host$port$path$query$fragment"; 
} 

function startsWith($haystack, $needle) {
    // search backwards starting from haystack length characters from the end
    return $needle === "" || strrpos($haystack, $needle, -strlen($haystack)) !== FALSE;
}

?>

请注意以$host开头的行,这是www.所在的位置。这应打印出http://usr:pss@www.example.com:81/mypath/myfile.html?a=b&b[]=2&b[]=3#myfragment

那就是说,我认为这是一个糟糕的主意,原因很多 - 您可能会使网址无效(例如,如果您的用户输入了m.facebook.com,那么现在您正在存储{{1} },哪个不存在?)。

答案 1 :(得分:0)

尝试parse_url:http://php.net/manual/en/function.parse-url.php

<?php
$parsed_url = parse_url( $url );
if( $parsed_url == false)
{
    // $url is invalid
}

if( $parsed_url['scheme'] != 'http' )
{
    $url = 'http://' . $url;
}

但是,这有问题 - 如果网站是https怎么办?或者该网站位于www?

以外的子域上

最好通过尝试通过文件命令或Curl加载来检查URL是否存在。

请参阅:How can I check if a URL exists via PHP?

答案 2 :(得分:0)

如果不存在,您需要添加www:

$uri = "http://google.com";
if (preg_match("/http:\/\/(w){3}./" , $uri)) {
    echo "It matches...";
} else {
    echo "not match, try to add";
    if (substr($uri , 0,5) =='https') $uri = str_replace("https://" , "https://www." , $uri); else $uri = str_replace("http://" , "http://www." , $uri); 
    echo $uri;
}