匹配所有有效的超链接

时间:2014-05-05 10:03:42

标签: php regex preg-replace

我正在尝试匹配所有超链接,即:

到目前为止,这段代码完成了相当不错的工作:

        /**
         * 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链接。参见:

任何可以找到所有匹配链接的解决方案?

2 个答案:

答案 0 :(得分:0)

只在角色类中添加少量字符并使其不区分大小写才能一直使用它。但不是很好看:)

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

答案 1 :(得分: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
       );
    }

到目前为止似乎工作得很好。