kwi / urllinker
在文本或HTML中自动链接URL
Requires
- php: >=5.3
This package is auto-updated.
Last update: 2024-09-23 23:01:52 UTC
README
UrlLinker是一个PHP模块,可以将纯文本片段转换为HTML,并将文本中的任何网址转换为HTML超链接。
安装
使用[Composer](https://getcomposer.org.cn/)下载库
` composer require kwi/urllinker `
在你的PHP文件中包含Composer的自动加载器
``` <?php
使用(过程式API)
print(htmlEscapeAndLinkUrls($text));
有关更长的示例,请参阅UrlLinker-example.php。
UrlLinker假设输入为纯文本,并返回HTML。如果您的输入已经是HTML,但其中包含尚未标记的网址,UrlLinker也可以处理这种情况
print(linkUrlsInTrustedHtml($html));
警告:后者必须在仅可信输入上使用,因为渲染恶意用户提供的HTML可能会导致通过跨站脚本使系统受到损害。另一方面,htmlEscapeAndLinkUrls
函数可以在不受信任的输入上安全使用。(您可以通过PHP的strip_tags函数从不受信任的输入中删除现有标签。)
使用(面向对象API)
``` $urlLinker = new KwiUrlLinker();
$urlLinker->linkUrlsAndEscapeHtml($text);
$urlLinker->linkUrlsInTrustedHtml($html); ```
在您的函数中,您可以依赖UrlLinkerInterface
``` class Example {
private $urlLinker;
public function __construct(KwiUrlLinkerInterface $urlLinker) {
$this->urlLinker = $urlLinker;}
public function doStuff($text) {
// 对 $text 进行操作…
return $this->urlLinker->linkUrlsAndEscapeHtml($text);
}
}
您可以通过将它们传递给UrlLinker的构造函数来为解析URL配置不同的选项
``` // 允许如 "ftp://example.com" 这样的Ftp地址:$urlLinker = new KwiUrlLinker(true);
// 允许像 "HTTP://exmaple.com" 这样的大写URL方案:$urlLinker = new KwiUrlLinker(false, true); ```
支持的地址
- 网络地址
- 支持的URL方案: "http" 和 "https"
http://
前缀是可选的。- 可以通过调整
$rexScheme
简单地添加对其他方案的额外支持,例如 "ftp"。 - 方案必须以小写形式编写。可以通过向
$rexUrlLinker
添加一个i
(PCRE_CASELESS
修饰符)来取消此要求。
- 可以使用域名或IPv4地址指定主机。
- 不支持IPv6地址。
- 允许端口号码。
- 允许国际资源标识符(IRI)。请注意,将IRI转换为URI的任务留给用户的浏览器。
- 为了减少误报,UrlLinker 会验证顶级域名是否在官方 IANA 有效 TLD 列表中。
- 随着 TLD 列表的扩展,UrlLinker 会定期更新。
- 在未来,这种做法可能会在 ICANN 不明智的新政策下失败,即以大量现金出售任意 TLD,但就目前而言,这是一种有效的拒绝无效 URL 的方法。
- 为了被识别,国际化顶级域名必须使用 Punycode 编码。
- 如果您需要支持不合格的域名,如
localhost
,您可以通过以下方式禁用 TLD 检查:1) 在$rexDomain
值中将+
替换为*
;2) 将“检查 TLD 是否有效”注释下的if
语句替换为if (true)
。这显然是一种快速而简单的修补方法,可能会造成误报。
- 支持的URL方案: "http" 和 "https"
- 电子邮件地址
- 支持常用的完整地址格式,包括由 Gmail 推广的“加号地址”。
- 不识别 RFC 允许但实际中从未见过的更隐蔽的地址变体。
- 简单的垃圾邮件保护:将 at 符号转换为 HTML 实体,以阻止简单的电子邮件地址收集器。
- 在正常句子上下文中,地址被正确识别。例如,在“访问 stackoverflow.com。”中,最后的句号不是 URL 的一部分。
- 用户输入经过适当的清理,以防止 跨站脚本(XSS),URL 中的 ampersands 被正确转义为
&
(这不适用于假设其输入为有效 HTML 的linkUrlsInTrustedHtml
函数)。
测试
单元测试使用 [PHPUnit](https://phpunit.de)编写。
` $ cd PATH_TO_URL_LINKER $ composer install $ phpunit `
背景
一个 Stackoverflow.com 的问题促使我考虑这个任务的难度。最初,这似乎很容易,但就像一个你不得不挠的痒处,我不断回到它,只是为了修复一个小问题。
如果您觉得这个代码有用,请随意点赞我的答案。
Antoine Sottiau 也有一个 C# 实现。
公共领域奉献
在法律允许的范围内,作者已放弃对 UrlLinker 所有的版权和相关或邻近权利。