#url #links #email #web #link #text

linkify

在纯文本中查找URL和电子邮件地址。注意处理周围的标点符号,如括号。

14个版本 (9个重大更新)

0.10.0 2023年6月24日
0.9.0 2022年7月11日
0.8.1 2022年4月14日
0.8.0 2021年11月26日
0.1.2 2017年6月9日

#33 in 文本处理

Download history 7422/week @ 2024-03-14 10404/week @ 2024-03-21 10987/week @ 2024-03-28 9529/week @ 2024-04-04 11410/week @ 2024-04-11 10778/week @ 2024-04-18 12892/week @ 2024-04-25 12762/week @ 2024-05-02 11715/week @ 2024-05-09 10909/week @ 2024-05-16 12234/week @ 2024-05-23 11418/week @ 2024-05-30 12763/week @ 2024-06-06 13479/week @ 2024-06-13 13041/week @ 2024-06-20 10657/week @ 2024-06-27

每月51,595次下载
用于 56 个Crate (直接使用26个)

MIT/Apache

40KB
696

Linkify

Linkify是一个Rust库,用于在纯文本中查找链接,如URL和电子邮件地址。它智能地处理链接的结束位置,例如与尾随标点符号。

Documentation Crate ci codecov

简介

您的反应可能是:“我需要这个库吗?为什么不用正则表达式?”让我们看看几个例子

  • http://example.com/.中,链接不应包括尾随的点
  • http://example.com/,不应包括尾随的逗号
  • (http://example.com/)不应包括括号

看起来很简单。但是,我们还有这些情况

  • https://en.wikipedia.org/wiki/Link_(The_Legend_of_Zelda)应包括尾随的括号
  • http://üñîçøðé.com/ä也应适用于Unicode(包括表情符号和Punycode)
  • <http://example.com/>不应包括尖括号

此库在上述情况和更多情况下表现如预期。它使用简单的线性时间扫描。

除了URL,它还可以查找电子邮件地址。

演示 🧪

在演示沙箱(Rust编译为WebAssembly)上在线试用: https://robinst.github.io/linkify/

如果您想在命令行上使用它,请尝试lychee。它使用linkify提取所有链接并检查它们是否有效,但它也可以像这样打印它们

$ echo 'Test https://example.org (and https://example.com)' | lychee --dump -
https://example.org/
https://example.com/

用法

基本用法

extern crate linkify;

use linkify::{LinkFinder, LinkKind};

let input = "Have you seen http://example.com?";
let finder = LinkFinder::new();
let links: Vec<_> = finder.links(input).collect();

assert_eq!(1, links.len());
let link = &links[0];

assert_eq!("http://example.com", link.as_str());
assert_eq!(14, link.start());
assert_eq!(32, link.end());
assert_eq!(&LinkKind::Url, link.kind());

允许无方案的URL的选项

use linkify::LinkFinder;

let input = "Look, no scheme: example.org/foo";
let mut finder = LinkFinder::new();

// true by default
finder.url_must_have_scheme(false);

let links: Vec<_> = finder.links(input).collect();
assert_eq!(links[0].as_str(), "example.org/foo");

限制链接类型

use linkify::{LinkFinder, LinkKind};

let input = "http://example.com and [email protected]";
let mut finder = LinkFinder::new();
finder.kinds(&[LinkKind::Email]);
let links: Vec<_> = finder.links(input).collect();

assert_eq!(1, links.len());
let link = &links[0];
assert_eq!("[email protected]", link.as_str());
assert_eq!(&LinkKind::Email, link.kind());

docs.rs上查看完整文档。

一致性

此Crate努力遵守各种标准,特别是

同时,它不保证返回的链接有效。如有疑问,它宁愿返回链接而不是跳过。

如果您需要验证URL,例如检查顶级域名(TLD),请在返回的链接上使用另一个库。

贡献

欢迎提交拉取请求、问题和评论!请确保为新特性和错误修复添加测试。

许可协议

Linkify 以MIT许可协议和Apache许可协议(版本2.0)的双重许可协议进行分发。有关详细信息,请参阅LICENSE-APACHELICENSE-MIT。提交拉取请求被视为接受这些许可协议条款。

依赖项

约170-315KB