ausi / slug-generator
Slug 生成器
Requires
- php: ^7.1 || ^8.0
- ext-intl: *
- ext-mbstring: *
- ext-pcre: *
- lib-icu: >=4.2.1
Requires (Dev)
- contao/easy-coding-standard: ^3.0
- phpstan/phpstan: ^0.12.40
- phpstan/phpstan-phpunit: ^0.12.16
- phpunit/phpunit: ^7.5.20 || ^8.5.4 || ^9.4.2
- psalm/plugin-phpunit: ^0.9
- slam/phpstan-extensions: ^5.0
- vimeo/psalm: ^3.9
This package is auto-updated.
Last update: 2024-09-08 18:34:31 UTC
README
此库提供用于生成 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-Aepfel
或 OE-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 中使用的有效字符。与正则表达式中的字符类相同的范围语法。例如 abc
、a-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 生成器内部使用 转换规则 将无效字符转换为有效字符。可以通过设置 transforms
、preTransforms
或 postTransforms
选项来自定义这些规则。通常,设置 preTransforms
是期望的,因为它在默认转换之前应用自定义转换。
如何使用转换规则(如 Lower
或 ASCII
)和 规则集(如 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为本项目提供性能分析工具的赞助。