ausi/slug-generator

Slug 生成器

资助包维护!
ausi

安装次数: 1,566,854

依赖: 23

建议者: 0

安全性: 0

星标: 801

关注者: 25

分支: 54

开放问题: 12

v1.1.1 2020-10-19 15:25 UTC

README

Build Status Coverage Packagist Version Downloads MIT License

此库提供用于生成 URL、文件名或任何具有有限字符集的目标的 slug 的方法。它基于 PHP 的 Transliterator 类,该类使用 CLDR 的数据来在不同脚本(例如,西里尔文到拉丁文)或类型(例如,大写转小写或从特殊字符到 ASCII)之间转换字符。

用法

<?php
use Ausi\SlugGenerator\SlugGenerator;

$generator = new SlugGenerator;

$generator->generate('Hello Wörld!');  // Output: hello-world
$generator->generate('Καλημέρα');      // Output: kalemera
$generator->generate('фильм');         // Output: film
$generator->generate('富士山');         // Output: fu-shi-shan
$generator->generate('國語');           // Output: guo-yu

// Different valid character set, a specified locale and a delimiter
$generator = new SlugGenerator((new SlugOptions)
    ->setValidChars('a-zA-Z0-9')
    ->setLocale('de')
    ->setDelimiter('_')
);
$generator->generate('Äpfel und Bäume');  // Aepfel_und_Baeume

安装

要安装库,请使用 Composer 或从 GitHub 下载源文件。

composer require ausi/slug-generator

为什么又要创建另一个 slug 库,不是已经有足够的了吗?

有许多代码片段和一些好的库可以创建 slugs,但我没有找到任何能满足我需求的东西。选项通常非常有限,这使得很难针对不同的用例进行自定义。一些库携带大量的规则集,试图将字符转换为 ASCII,没有人使用 Unicode 的 CLDR,它是转写规则的行业标准,以及许多其他转换。

但最重要的是,没有库能够做到“正确的”转换,比如将德语的 Ö-Äpfel 转换为 OE-Aepfel,或者将土耳其语的 İNATÇI 转换为 inatçı。因为 CLDR 转写规则是上下文相关的,它们知道如何正确地转换为 OE-Aepfel 而不是 Oe-AepfelOE-AEpfel。CLDR 也考虑了语言,知道土耳其语的大写字母 I 的小写形式是 ı 而不是 i

选项

所有选项都可以为生成器对象本身设置 new SlugGenerator($options),或者在调用 generate($text, $options) 时覆盖。选项可以作为数组或作为 SlugOptions 对象传递。

delimiter,默认 "-"

分隔符可以是任何字符串,它用于分隔单词。它将从 slug 的开头和结尾中删除。

$generator->generate('Hello World!');                         // Result: hello-world
$generator->generate('Hello World!', ['delimiter' => '_']);   // Result: hello_world
$generator->generate('Hello World!', ['delimiter' => '%20']); // Result: hello%20world

validChars,默认 "a-z0-9"

允许在 slug 中使用的有效字符。与正则表达式中的字符类相同的范围语法。例如 abca-z0-9äöüß\p{Ll}\-_

$generator->generate('Hello World!');                             // Result: hello-world
$generator->generate('Hello World!', ['validChars' => 'A-Z']);    // Result: HELLO-WORLD
$generator->generate('Hello World!', ['validChars' => 'A-Za-z']); // Result: Hello-World

ignoreChars,默认 "\p{Mn}\p{Lm}"

应完全删除的字符,不使用分隔符替换。它使用与 validChars 选项相同的语法。

$generator->generate("don't remove");                         // Result: don-t-remove
$generator->generate("don't remove", ['ignoreChars' => "'"]); // Result: dont-remove

locale,默认 ""

用于 Unicode 转换的区域设置。

$generator->generate('Hello Wörld!');                        // Result: hello-world
$generator->generate('Hello Wörld!', ['locale' => 'de']);    // Result: hello-woerld
$generator->generate('Hello Wörld!', ['locale' => 'en_US']); // Result: hello-world

transforms,默认 Upper, Lower, Latn, ASCII, Upper, Lower

slug 生成器内部使用 转换规则 将无效字符转换为有效字符。可以通过设置 transformspreTransformspostTransforms 选项来自定义这些规则。通常,设置 preTransforms 是期望的,因为它在默认转换之前应用自定义转换。

如何使用转换规则(如 LowerASCII)和 规则集(如 a > b; c > d;)的详细信息,请参阅 ICU 网站:http://userguide.icu-project.org/transforms

$generator->generate('Damn 💩!!');                                           // Result: damn
$generator->generate('Damn 💩!!', ['preTransforms' => ['💩 > Ice-Cream']]);  // Result: damn-ice-cream

$generator->generate('©');                                          // Result: c
$generator->generate('©', ['preTransforms' => ['© > Copyright']]);  // Result: copyright
$generator->generate('©', ['preTransforms' => ['Hex']]);            // Result: u00a9
$generator->generate('©', ['preTransforms' => ['Name']]);           // Result: n-copyright-sign

赞助商

感谢Blackfire为本项目提供性能分析工具的赞助。