2013-04-10 65 views
0

爲什麼下面的代碼不能縮短這個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); 
} 

回答

0

我有問題要回答你的問題,因爲這取決於你問什麼,因爲我看到兩個答案:

  1. 因爲正則表達式不捕獲它。
  2. 因爲它在功能上下文中不被視爲有效的URL。

爲了正確工作,您需要正確定義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(保持未指定),沒有更多的回答不是增加規格或固定的模式(或兩者)。然而

第二個問題是比較容易回答:

而且爲什麼沒有把它變成一個實際的可點擊的網址是什麼?

因爲它沒有被捕獲。