使用正则表达式在php中匹配url模式

See*_*ema 11 php regex url

我想匹配墙贴中的url链接并用锚标记替换此链接,为此我使用下面的正则表达式.

我想匹配4种类型的网址:

  1. http://example.com
  2. https://example.com
  3. www.example.com
  4. example.com
preg_replace('@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@',
             '<a href="$1">$1</a>', $subject);
Run Code Online (Sandbox Code Playgroud)

此表达式仅匹配前两种类型的URL.

如果我将此表达式用于匹配url模式 '@(www?([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@',那么它只匹配第三种类型的url模式.

如何将所有四种类型的url模式与单个正则表达式匹配?

Nev*_*kes 15

说实话,我会使用不同的正则表达式.就像格鲁伯在2009年发布的那样:

\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))
Run Code Online (Sandbox Code Playgroud)

或者这个Gruber 在2010年发布的更新版本(谢谢,@ IMSoP):

(?i)\b((?:[a-z][\w-]+:(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这里有一个较新版本的正则表达式:http://daringfireball.net/2010/07/improved_regex_for_matching_urls (2认同)
  • 用PHP实现:[http://stackoverflow.com/a/10002262/1055533 ](http://stackoverflow.com/a/10002262/1055533) (2认同)

Mār*_*dis 15

使用Nev Stokes给出链接的完整工作示例:

public function clickableUrls($html){
    return $result = preg_replace(
        '%\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))%s',
        '<a href="$1">$1</a>',
        $html
    );
}
Run Code Online (Sandbox Code Playgroud)