將字串轉換為 slug。
由歐洲維也納的 Florian Eckerstorfer 在許多偉大貢獻者的幫助下開發。
ae
替換ä
)。您可以透過 Composer 安裝 Slugify:
composer require cocur/slugify
Slugify 需要 PHP 的多位元組字串擴充。通常,您可以在編譯 PHP 時使用設定選項--enable-mbstring
。更多資訊可以在 PHP 文檔中找到。
整合可能需要進一步的步驟。
生成一個 slug:
use Cocur Slugify Slugify ;
$ slugify = new Slugify ();
echo $ slugify -> slugify ( " Hello World! " ); // hello-world
您也可以更改Slugify
使用的分隔符號:
echo $ slugify -> slugify ( " Hello World! " , " _ " ); // hello_world
該程式庫還包含CocurSlugifySlugifyInterface
。每當您需要鍵入提示Slugify
實例時,請使用此介面。
若要新增其他音譯規則,您可以使用addRule()
方法。
$ slugify -> addRule ( " i " , " ey " );
echo $ slugify -> slugify ( " Hi " ); // hey
Slugify 中使用的許多音譯規則都是特定於某種語言的。因此,這些規則使用規則集進行分類。預設情況下,最流行的規則會按特定順序啟動。您可以變更啟動哪些規則集以及它們的啟動順序。當不同語言的規則有衝突時,順序就很重要。例如,在德語中ä
音譯為ae
,在土耳其語中正確的音譯是a
。預設使用德語音譯,因為德語在網路上使用得更頻繁。如果您想使用土耳其語音譯,您就有可能。您可以在創建構造函數後激活它:
$ slugify = new Slugify ();
$ slugify -> slugify ( " ä " ); // -> "ae"
$ slugify -> activateRuleSet ( " turkish " );
$ slugify -> slugify ( " ä " ); // -> "a"
另一種方法是將規則集及其順序傳遞給建構函式。
$ slugify = new Slugify ([ " rulesets " => [ " default " , " turkish " ]]);
$ slugify -> slugify ( " ä " ); // -> "a"
您可以在資源/規則中找到可用規則集的清單。
建構函式採用一個選項數組,您已經在上面看到了rulesets
選項。您也可以變更用於用分隔符號取代字元的正規表示式。
$ slugify = new Slugify ([ " regexp " => " /([^A-Za-z0-9]|-)+/ " ]);
(上例中使用的正規表示式是預設的。)
預設情況下,Slugify 會將 slug 轉換為小寫。如果要保留字串的大小寫,可以將lowercase
選項設為 false。
$ slugify = new Slugify ([ " lowercase " => false ]);
$ slugify -> slugify ( " Hello World " ); // -> "Hello-World"
小寫是在使用正規表示式之前完成的。如果您想要保留小寫行為,但正規表示式需要符合大寫字母,則可以將lowercase_after_regexp
選項設為true
。
$ slugify = new Slugify ([
" regexp " => " /(?<=[[:^upper:]])(?=[[:upper:]])/ " ,
" lowercase_after_regexp " => false ,
]);
$ slugify -> slugify ( " FooBar " ); // -> "foo-bar"
預設情況下,Slugify 將使用破折號作為分隔符號。如果您想使用不同的預設分隔符,可以設定separator
選項。
$ slugify = new Slugify ([ " separator " => " _ " ]);
$ slugify -> slugify ( " Hello World " ); // -> "hello_world"
預設情況下,Slugify 將在傳回 slug 之前刪除前導和尾隨分隔符號。如果您不想修剪 slug,可以將trim
選項設為 false。
$ slugify = new Slugify ([ " trim " => false ]);
$ slugify -> slugify ( " Hello World " ); // -> "hello-world-"
您可以透過將選項陣列作為第二個參數傳遞給slugify()
方法來動態覆寫上述任何選項。例如:
$ slugify = new Slugify ();
$ slugify -> slugify ( " Hello World " , [ " lowercase " => false ]); // -> "Hello-World"
您也可以這樣修改分隔符號:
$ slugify = new Slugify ();
$ slugify -> slugify ( " Hello World " , [ " separator " => " _ " ]); // -> "hello_world"
您甚至可以啟動自訂規則集,而無需觸及預設規則:
$ slugify = new Slugify ();
$ slugify -> slugify ( " für " , [ " ruleset " => " turkish " ]); // -> "fur"
$ slugify -> slugify ( " für " ); // -> "fuer"
如果您報告音譯中的錯誤和錯誤,特別是如果您是該語言和問題的母語,我們將不勝感激。請隨意在問題中詢問其他語言,但請注意,此儲存庫的維護者並不支援所有語言。如果您可以提供包含新語言規則的拉取請求或擴展現有語言的規則,那就太棒了。
要新增語言,您需要:
Resources/rules
中建立[language].json
CocurSlugifySlugify::$options
。如果您新增語言,所有現有測驗仍然必須通過php bin/generate-default.php
tests/SlugifyTest.php
中加入語言測試。如果語言位於預設規則集中,則將測試案例新增至defaultRuleProvider()
,否則新增至customRulesProvider()
。提交公關。非常感謝。
為了創造一個開放和熱情的環境,我們作為貢獻者和維護者承諾讓每個人參與我們的計畫和社區成為無騷擾的體驗,無論年齡、體型、殘疾、種族、性別認同和表達,經驗水平、國籍、個人外表、種族、宗教或性認同和取向。
完整的行為準則可在此處找到。
這個項目不適合仇恨。如果您有任何問題,請聯絡 Florian:[email protected]
Slugify 包含 Symfony 套裝和服務定義,可讓您將其用作 Symfony 應用程式中的服務。程式碼位於CocurSlugifyBridgeSymfonyCocurSlugifyBundle
中,您只需啟動它:
Slugify 4.0.0 中已刪除對 Symfony 2 的支持,請使用cocur/slugify@3
。
// app/AppKernel.php
class AppKernel extends Kernel
{
public function registerBundles ()
{
$ bundles = [
// ...
new Cocur Slugify Bridge Symfony CocurSlugifyBundle (),
];
}
}
// config/bundles.php
return [
// ...
Cocur Slugify Bridge Symfony CocurSlugifyBundle::class => [ " all " => true ],
];
現在您可以在應用程式中的任何位置使用cocur_slugify
服務,例如在控制器中:
$ slug = $ this -> get ( " cocur_slugify " )-> slugify ( " Hello World! " );
該捆綁包還為cocur_slugify
服務提供了別名slugify
:
$ slug = $ this -> get ( " slugify " )-> slugify ( " Hello World! " );
如果您使用autowire
(Symfony >=3.3),您可以將其註入到您的服務中,如下所示:
public function __construct( Cocur Slugify SlugifyInterface $ slugify )
您可以在config.yml
(Symfony 2-3) 或config/packages/cocur_slugify.yaml
(Symfony 4) 中設定以下組態設定來調整 slugify 服務:
cocur_slugify :
lowercase : false # or true
separator : " - " # any string
# regexp:
rulesets : ["austrian"] # List of rulesets: https://github.com/cocur/slugify/tree/master/Resources/rules
如果您將 Symfony 框架與 Twig 一起使用,則可以在設定 Symfony 整合後在範本中使用 Twig 篩選器slugify
(請參閱上文)。
{{ ' Hällo Wörld ' | slugify }}
如果您在 Symfony 框架之外使用 Twig,您首先需要將擴充功能新增至您的環境:
use Cocur Slugify Bridge Twig SlugifyExtension ;
use Cocur Slugify Slugify ;
$ twig = new Twig_Environment ( $ loader );
$ twig -> addExtension ( new SlugifyExtension (Slugify:: create ()));
要將 Twig 過濾器與 TwigBridge for Laravel 一起使用,您需要使用閉包來新增 Slugify 擴充功能:
// laravel/app/config/packages/rcrowe/twigbridge/config.php
' extensions ' => array (
//...
function () {
return new Cocur Slugify Bridge Twig SlugifyExtension ( Cocur Slugify Slugify:: create ());
},
),
您可以在 Twig 文件中找到有關註冊擴充功能的更多資訊。
我們不需要額外的整合來在 Mustache.php 中使用 Slugify。如果你想在 Mustache 中使用 Slugify,只需增加一個助手:
use Cocur Slugify Slugify ;
$ mustache = new Mustache_Engine ([
// ...
" helpers " => [
" slugify " => function ( $ string , $ separator = null ) {
return Slugify:: create ()-> slugify ( $ string , $ separator );
},
],
]);
Slugify 還提供了一個服務提供者來整合到 Laravel(4.1 及更高版本)中。
在 Laravel 專案的app/config/app.php
檔案中,將服務提供者新增至「providers」陣列:
' providers ' => array (
" CocurSlugifyBridgeLaravelSlugifyServiceProvider " ,
)
並將外觀添加到“aliases”數組中:
' aliases ' => array (
" Slugify " => " CocurSlugifyBridgeLaravelSlugifyFacade " ,
)
然後,您可以在控制器中使用Slugify::slugify()
方法:
$ url = Slugify:: slugify ( " welcome to the homepage " );
Slugify 可以輕鬆地在 Zend Framework 2 應用程式中使用。包含的橋提供已為您註冊的服務和視圖助理。
只需像這樣在您的配置中啟用該模組即可。
return [
//...
" modules " => [
" Application " ,
" ZfcBase " ,
" CocurSlugifyBridgeZF2 " , // <- Add this line
//...
],
//...
];
之後,您可以檢索CocurSlugifySlugify
服務(或slugify
別名)並產生 slug。
/** @var ZendServiceManagerServiceManager $sm */
$ slugify = $ sm -> get ( " CocurSlugifySlugify " );
$ slug = $ slugify -> slugify ( " Hällo Wörld " );
$ anotherSlug = $ slugify -> slugify ( " Hällo Wörld " , " _ " );
在您的視圖範本中,使用slugify
助手來產生 slugs。
echo $ this -> slugify ( " Hällo Wörld " ); ?>
echo $ this -> slugify ( " Hällo Wörld " , " _ " ); ?>
可以透過定義此配置鍵來自訂該服務(也在視圖助理中使用)。
return [
" cocur_slugify " => [
" reg_exp " => " /([^a-zA-Z0-9]|-)+/ " ,
],
];
Slugify 包含一個 Nette 擴展,可讓您將其用作 Nette 應用程式中的服務。您只需在config.neon
中註冊它:
# app/config/config.neon
extensions :
slugify : CocurSlugifyBridgeNetteSlugifyExtension
現在您可以在應用程式中的任何位置使用CocurSlugifySlugifyInterface
服務,例如在演示器中:
class MyPresenter extends Nette Application UI Presenter
{
/** @var CocurSlugifySlugifyInterface @inject */
public $ slugify ;
public function renderDefault ()
{
$ this -> template -> hello = $ this -> slugify -> slugify ( " Hällo Wörld " );
}
}
如果您使用 Nette Framework 及其本機 Latte 範本引擎,則可以在設定 Nette 擴充功能後在範本中使用 Latte 濾鏡slugify
(請參閱上文)。
{ $ hello |slugify }
如果您在 Nette Framework 之外使用 Latte,您首先需要將過濾器添加到您的引擎中:
use Cocur Slugify Bridge Latte SlugifyHelper ;
use Cocur Slugify Slugify ;
use Latte ;
$ latte = new Latte Engine ();
$ latte -> addFilter ( " slugify " , [ new SlugifyHelper (Slugify:: create ()), " slugify " ]);
Slugify 不需要特定的橋接器即可與 Slim 3 搭配使用,只需新增以下設定:
$ container [ " view " ] = function ( $ c ) {
$ settings = $ c -> get ( " settings " );
$ view = new Slim Views Twig (
$ settings [ " view " ][ " template_path " ],
$ settings [ " view " ][ " twig " ]
);
$ view -> addExtension (
new Slim Views TwigExtension (
$ c -> get ( " router " ),
$ c -> get ( " request " )-> getUri ()
)
);
$ view -> addExtension (
new Cocur Slugify Bridge Twig SlugifyExtension (
Cocur Slugify Slugify:: create ()
)
);
return $ view ;
};
在模板中,您可以像這樣使用它:
< a href = " /blog/{{ post . title | slugify }} " >{{ post . title | raw }} a > h5 >
Slugify 提供了一個與league/container
一起使用的服務提供者:
use Cocur Slugify ;
use League Container ;
/* @var ContainerContainerInterface $container */
$ container -> addServiceProvider (
new Slugify Bridge League SlugifyServiceProvider ()
);
/* @var SlugifySlugify $slugify */
$ slugify = $ container -> get ( Slugify SlugifyInterface::class);
您可以透過共享所需的選項來配置它:
use Cocur Slugify ;
use League Container ;
/* @var ContainerContainerInterface $container */
$ container -> share ( " config.slugify.options " , [
" lowercase " => false ,
" rulesets " => [ " default " , " german " ],
]);
$ container -> addServiceProvider (
new Slugify Bridge League SlugifyServiceProvider ()
);
/* @var SlugifySlugify $slugify */
$ slugify = $ container -> get ( Slugify SlugifyInterface::class);
您可以透過共用來設定要使用的規則提供者:
use Cocur Slugify ;
use League Container ;
/* @var ContainerContainerInterface $container */
$ container ->share( Slugify RuleProvider RuleProviderInterface::class, function () {
return new Slugify RuleProvider FileRuleProvider ( __DIR__ . ' /../../rules ' );
]);
$ container -> addServiceProvider ( new Slugify Bridge League SlugifyServiceProvider ());
/* @var SlugifySlugify $slugify */
$ slugify = $ container -> get ( Slugify SlugifyInterface::class);
支援 Symfony 6。
版本 4 沒有引入新的主要功能,但增加了對 Symfony 4 和 5、Twig 3 以及最重要的 PHP 7.3 和 7.4 的支援。
不再支援 PHP 5、Twig 1 和 Silex。
composer.json
中需要多位元組擴充(作者:wandersonwhcr)DefaultRuleProvider
中加入了缺少的法語規則(由 gsouf 提供)getName()
加入到CocurSlugifyBridgeTwigSlugifyExtension
(由 TomCan 提供)DefaultRuleProvider
中的規則進行排序(由 tbmatuka 提供)singleton
取代bindShared
(由 sunspikes 提供)singleton
取代bindShared
(由 sunspikes 提供)沒有新功能或錯誤修復,但時候將 Slugify 升級到 v1.0 了。
protected
(由 acelaya)Ď
的音譯(由 michalskop)Slugify
類別中的角色組織該版本引入了與 Symfony2、Silex 和 Twig 的可選整合。您仍然可以在任何其他框架中使用該庫。我決定包含這些橋,因為存在來自其他開發人員的集成,但他們使用過時的 cocur/slugify 版本。將這些小橋接類別包含在庫中使我可以更輕鬆地維護它們。
$separator
參數加入到SlugifyInterface
幾乎完全重寫了程式碼,刪除了iconv
支持,因為底層庫已損壞。現在程式碼更好更快。非常感謝馬爾琴科·亞歷山大。
中文的支持是經許可改編自 jifei/拼音。
Slugify 是 Cocur 的一個專案。您可以在 Twitter 上聯絡我們: @cocurco
如果您需要支持,您可以在 Twitter 上提問(當然,前提是您的問題很短),或者您可以在 Gitter 上加入我們的聊天。
如果您想支持 Slugify 的開發,您可以幫助我們提供額外的音譯,或在音譯錯誤時通知我們。如果您能直接在 Github 上向我們發送 Pull Request,我們將不勝感激。如果您從未為 Github 上的專案做出貢獻,我們很樂意為您提供協助。只需在 Twitter 上提問或直接加入我們的 Gitter。
你總是可以透過寄給我一兩歐元來幫助我(Florian,最初的開發者和維護者)。
麻省理工學院許可證 (MIT)
版權所有 (c) 2012-2017 弗洛里安‧艾克斯托弗
特此免費授予任何獲得本軟體和相關文件文件(「軟體」)副本的人不受限制地使用本軟體,包括但不限於使用、複製、修改、合併的權利、發布、分發、再授權和/或銷售軟體的副本,並允許向其提供軟體的人員這樣做,但須滿足以下條件:
上述版權聲明和本授權聲明應包含在本軟體的所有副本或主要部分中。
本軟體以「現況」提供,不提供任何明示或暗示的保證,包括但不限於適銷性、特定用途的適用性和不侵權的保證。 IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE軟體.