kwi/urllinker

在文本或HTML中自动链接URL

dev-master 2019-09-23 11:38 UTC

This package is auto-updated.

Last update: 2024-09-23 23:01:52 UTC


README

UrlLinker是一个PHP模块,可以将纯文本片段转换为HTML,并将文本中的任何网址转换为HTML超链接。

安装

  1. 使用[Composer](https://getcomposer.org.cn/)下载库

    ` composer require kwi/urllinker `

  2. 在你的PHP文件中包含Composer的自动加载器

    ``` <?php

    require_once __DIR__.'/vendor/autoload.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 添加一个 iPCRE_CASELESS 修饰符)来取消此要求。
    • 可以使用域名或IPv4地址指定主机。
      • 不支持IPv6地址。
    • 允许端口号码。
    • 允许国际资源标识符(IRI)。请注意,将IRI转换为URI的任务留给用户的浏览器。
    • 为了减少误报,UrlLinker 会验证顶级域名是否在官方 IANA 有效 TLD 列表中。
      • 随着 TLD 列表的扩展,UrlLinker 会定期更新。
      • 在未来,这种做法可能会在 ICANN 不明智的新政策下失败,即以大量现金出售任意 TLD,但就目前而言,这是一种有效的拒绝无效 URL 的方法。
      • 为了被识别,国际化顶级域名必须使用 Punycode 编码。
      • 如果您需要支持不合格的域名,如 localhost,您可以通过以下方式禁用 TLD 检查:1) 在 $rexDomain 值中将 + 替换为 *;2) 将“检查 TLD 是否有效”注释下的 if 语句替换为 if (true)。这显然是一种快速而简单的修补方法,可能会造成误报。
  • 电子邮件地址
    • 支持常用的完整地址格式,包括由 Gmail 推广的“加号地址”。
    • 不识别 RFC 允许但实际中从未见过的更隐蔽的地址变体。
    • 简单的垃圾邮件保护:将 at 符号转换为 HTML 实体,以阻止简单的电子邮件地址收集器。
  • 在正常句子上下文中,地址被正确识别。例如,在“访问 stackoverflow.com。”中,最后的句号不是 URL 的一部分。
  • 用户输入经过适当的清理,以防止 跨站脚本(XSS),URL 中的 ampersands 被正确转义为 &amp;(这不适用于假设其输入为有效 HTML 的 linkUrlsInTrustedHtml 函数)。

测试

单元测试使用 [PHPUnit](https://phpunit.de)编写。

` $ cd PATH_TO_URL_LINKER $ composer install $ phpunit `

背景

一个 Stackoverflow.com 的问题促使我考虑这个任务的难度。最初,这似乎很容易,但就像一个你不得不挠的痒处,我不断回到它,只是为了修复一个小问题。

如果您觉得这个代码有用,请随意点赞我的答案。

Antoine Sottiau 也有一个 C# 实现

公共领域奉献

在法律允许的范围内,作者已放弃对 UrlLinker 所有的版权和相关或邻近权利。

更多信息请参阅: http://creativecommons.org/publicdomain/zero/1.0/