一个可以完美匹配网页链接的正则表达式
先上正则
/(https?:\/\/)?(([0-9a-z.]+\.[a-z]+)|(([0-9]{1,3}\.){3}[0-9]{1,3}))(:[0-9]+)?(\/[0-9a-z%/.\-_]*)?(\?[0-9a-z=&%_\-]*)?(\#[0-9a-z=&%_\-]*)?/ig
下面这段js
代码可以将文本中的所有链接替换成a标记
text.replace(
/(https?:\/\/)?(([0-9a-z.]+\.[a-z]+)|(([0-9]{1,3}\.){3}[0-9]{1,3}))(:[0-9]+)?(\/[0-9a-z%/.\-_]*)?(\?[0-9a-z=&%_\-]*)?(\#[0-9a-z=&%_\-]*)?/ig,
function ($0, $1) {
return '<a href="'
+ ($1 ? '' : 'http://') //如果没有匹配到协议,自动添加http协议
+ $0 + '">' + $0 + '</a>';
}
)
略作解释
正则部分 | 匹配对象 | 是否必须 |
---|---|---|
(https?:\/\/)? | 协议 | 否 |
(([0-9a-z.]+\.[a-z]+)|(([0-9]{1,3}\.){3}[0-9]{1,3})) | 域名 或 ip地址 | 是 |
(:[0-9]+)? | 端口号 | 否 |
(\/[0-9a-z%/.\-_]*)? | 路径 | 否 |
(\?[0-9a-z=&%_\-]*)? | 参数 | 否 |
(\#[0-9a-z=&%_\-]*)? | 锚点 | 否 |