2014-05-05 32 views
0

我想匹配的所有超鏈接,即:匹配所有有效鏈接

到目前爲止,這段代碼,這項工作不錯:

 /** 
     * Convert links 
     */ 

      $str = preg_replace('$(https?://[a-z0-9_./?=&#-]+)(?![^<>]*>)$i', ' <a href="$1" target="_blank">$1</a> ', $str." "); 
      $str = preg_replace('$(www\.[a-z0-9_./?=&#-]+)(?![^<>]*>)$i', '<a href="http://$1" target="_blank">$1</a> ', $str." "); 

但是我偶然發現了兩個不起作用的VALID鏈接。請參閱:

的任何解決方案,會發現所有匹配的鏈接?

+0

那麼'troll.lol'也是有效的?在那個筆記上,[檢查這個問題](http://stackoverflow.com/questions/37684/how-to-replace-plain-urls-with-links) – HamZa

回答

0

只有在你的角色類中添加幾個字符,並使其不區分大小寫,才能使用它。但是,並非徒有其表:)

(?i)(https?://[a-z0-9_./?=&#-,;-]+)(?![^<>]*>) 
0

我結束了使用此:

/** 
* Convert URL to links 
*/ 

    function make_links($text) { 
     return preg_replace(
     array(
      '/(?(?=<a[^>]*>.+<\/a>) 
       (?:<a[^>]*>.+<\/a>) 
       | 
       ([^="\']?)((?:https?|ftp|bf2|):\/\/[^<> \n\r]+) 
      )/iex', 
      '/<a([^>]*)target="?[^"\']+"?/i', 
      '/<a([^>]+)>/i', 
      '/(^|\s)(www.[^<> \n\r]+)/iex', 
      '/(([_A-Za-z0-9-]+)(\\.[_A-Za-z0-9-]+)*@([A-Za-z0-9-]+) 
      (\\.[A-Za-z0-9-]+)*)/iex' 
      ), 
     array(
      "stripslashes((strlen('\\2')>0?'\\1<a href=\"\\2\">\\2</a>\\3':'\\0'))", 
      '<a\\1', 
      '<a\\1 target="_blank">', 
      "stripslashes((strlen('\\2')>0?'\\1<a href=\"http://\\2\">\\2</a>\\3':'\\0'))", 
      "stripslashes((strlen('\\2')>0?'<a href=\"mailto:\\0\">\\0</a>':'\\0'))" 
      ), 
      $text 
     ); 
    } 

似乎是工作不錯迄今。