这个URL缩短器出了什么问题?

时间:2013-04-10 12:00:51

标签: php url

为什么以下代码没有缩短此网址?为什么不将它变成实际的可点击URL?这个功能似乎适用于所有其他情况,但这个。

URL:

strongatheism.net/library/atheology/argument_from_noncognitivism/

代码:

function urlfixer($text){

   $pattern  = '#\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))#';
   $callback = create_function('$matches', '
       $url       = array_shift($matches);      
       $url_parts = parse_url($url);

       $text = parse_url($url, PHP_URL_HOST) . parse_url($url, PHP_URL_PATH);
       $text = preg_replace("/^www./", "", $text);

       $last = -(strlen(strrchr($text, "/"))) + 1;
       if ($last < 0) {
           $text = substr($text, 0, $last) . "&hellip;";
       }

        $url = "http://" . str_replace("http://","",$url);
       return sprintf(\'<a rel="nofollow" target="_blank" href="%s">%s</a>\', $url, $text);
   ');

   return preg_replace_callback($pattern, $callback, $text);
}

1 个答案:

答案 0 :(得分:0)

我有问题回答你的问题,因为根据你的要求我会看到两个答案:

  1. 因为正则表达式无法捕获它。
  2. 因为在该函数的上下文中它不被视为有效的URL。
  3. 为了正常工作,您需要正确定义URL构成的内容(此处采用正则表达式模式的形式),或者您需要在自己的规范中定义它(在问题中缺少)。

    具有复杂正则表达式的优秀代码始终包含正则表达式的确切描述,因为它们往往变得神秘。这样的评论也可以作为一个有效输入资格的小规范。代码看起来像(example taken from youtube video ID):

    $pattern = 
        '%^# Match any youtube URL
        (?:https?://)?  # Optional scheme. Either http or https
        (?:www\.)?      # Optional www subdomain
        (?:             # Group host alternatives
          youtu\.be/    # Either youtu.be,
        | youtube\.com  # or youtube.com
          (?:           # Group path alternatives
            /embed/     # Either /embed/
          | /v/         # or /v/
          | /watch\?v=  # or /watch\?v=
          )             # End path alternatives.
        )               # End host alternatives.
        ([\w-]{10,12})  # Allow 10-12 for 11 char youtube id.
        $%x'
        ;
    

    由于您的问题缺乏构成有效URL的内容(仍然未指定),因此无需添加规范或修复模式(或两者)即可回答。

    然而,第二个问题更容易回答:

      

    为什么不将它变成实际的可点击URL?

    因为没有捕获。