تحويل سلسلة إلى سبيكة.
تم تطويره بواسطة فلوريان إكرستورفر في فيينا، أوروبا بمساعدة العديد من المساهمين العظماء.
ae
يستبدل ä
).يمكنك تثبيت Slugify من خلال Composer:
composer require cocur/slugify
يتطلب Slugify امتداد Multibyte String من PHP. عادةً يمكنك استخدام خيار التكوين --enable-mbstring
أثناء ترجمة PHP. يمكن العثور على مزيد من المعلومات في وثائق PHP.
قد تكون هناك حاجة إلى مزيد من الخطوات للتكامل.
توليد سبيكة:
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 بتحويل الارتداد إلى أحرف صغيرة. إذا كنت تريد الحفاظ على حالة السلسلة، يمكنك ضبط خيار lowercase
على خطأ.
$ 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 بإزالة الفواصل البادئة واللاحقة قبل إرجاع الارتداد الثابت. إذا كنت لا تريد قطع البزاقة، يمكنك ضبط خيار trim
على خطأ.
$ 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"
نحن نقدر حقًا إذا قمت بالإبلاغ عن الأخطاء والأخطاء في الترجمة الصوتية، خاصة إذا كنت متحدثًا أصليًا للغة والسؤال. لا تتردد في طلب لغات إضافية في القضايا، ولكن يرجى ملاحظة أن المشرف على هذا المستودع لا يتحدث جميع اللغات. إذا كان بإمكانك تقديم طلب سحب يتضمن قواعد للغة جديدة أو توسيع القواعد للغة موجودة، فسيكون ذلك أمرًا رائعًا.
لإضافة لغة جديدة تحتاج إلى:
[language].json
في Resources/rules
CocurSlugifySlugify::$options
. إذا قمت بإضافة اللغة هناك فلا يزال يتعين اجتياز جميع الاختبارات الحاليةphp bin/generate-default.php
tests/SlugifyTest.php
. إذا كانت اللغة ضمن مجموعة القواعد الافتراضية، فأضف حالات الاختبار الخاصة بك إلى defaultRuleProvider()
، وإلا إلى customRulesProvider()
.إرسال العلاقات العامة. شكراً جزيلاً.
من أجل تعزيز بيئة مفتوحة ومرحبة، نتعهد نحن كمساهمين ومشرفين بجعل المشاركة في مشروعنا ومجتمعنا تجربة خالية من التحرش للجميع، بغض النظر عن العمر وحجم الجسم والإعاقة والعرق والهوية الجنسية والتعبير. مستوى الخبرة أو الجنسية أو المظهر الشخصي أو العرق أو الدين أو الهوية الجنسية والتوجه.
يمكن العثور على قواعد السلوك الكاملة هنا.
هذا المشروع ليس مكانا للكراهية. إذا كان لديك أي مشاكل يرجى الاتصال بفلوريان: [email protected]
يحتوي Slugify على حزمة Symfony وتعريف الخدمة الذي يسمح لك باستخدامه كخدمة في تطبيق Symfony الخاص بك. الرمز موجود في CocurSlugifyBridgeSymfonyCocurSlugifyBundle
وتحتاج فقط إلى تنشيطه:
لقد تم إسقاط دعم Symfony 2 في Slugify 4.0.0، استخدم 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! " );
توفر الحزمة أيضًا اسمًا مستعارًا slugify
لخدمة cocur_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، فيمكنك استخدام مرشح Twig slugify
في القوالب الخاصة بك بعد إعداد عمليات تكامل Symfony (انظر أعلاه).
{{ ' Hällo Wörld ' | slugify }}
إذا كنت تستخدم Twig خارج إطار عمل Symfony، فستحتاج أولاً إلى إضافة الامتداد إلى بيئتك:
use Cocur Slugify Bridge Twig SlugifyExtension ;
use Cocur Slugify Slugify ;
$ twig = new Twig_Environment ( $ loader );
$ twig -> addExtension ( new SlugifyExtension (Slugify:: create ()));
لاستخدام مرشح Twig مع TwigBridge لـ 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.
لا نحتاج إلى تكامل إضافي لاستخدام Slugify في Moustache.php. إذا كنت تريد استخدام Slugify في Moustache، فما عليك سوى إضافة مساعد:
use Cocur Slugify Slugify ;
$ mustache = new Mustache_Engine ([
// ...
" helpers " => [
" slugify " => function ( $ string , $ separator = null ) {
return Slugify:: create ()-> slugify ( $ string , $ separator );
},
],
]);
يوفر Slugify أيضًا مزود خدمة للدمج في Laravel (الإصدارات 4.1 والإصدارات الأحدث).
في ملف app/config/app.php
الخاص بمشروع Laravel، أضف مزود الخدمة إلى مصفوفة "providers":
' providers ' => array (
" CocurSlugifyBridgeLaravelSlugifyServiceProvider " ,
)
وأضف الواجهة إلى مصفوفة "الأسماء المستعارة":
' 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
) وإنشاء سبيكة ثابتة.
/** @var ZendServiceManagerServiceManager $sm */
$ slugify = $ sm -> get ( " CocurSlugifySlugify " );
$ slug = $ slugify -> slugify ( " Hällo Wörld " );
$ anotherSlug = $ slugify -> slugify ( " Hällo Wörld " , " _ " );
في قوالب العرض الخاصة بك، استخدم المساعد slugify
لإنشاء الارتباطات الثابتة.
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 الأصلي الخاص به، فيمكنك استخدام مرشح Latte slugify
في القوالب الخاصة بك بعد إعداد ملحق Nette (انظر أعلاه).
{ $ hello |slugify }
إذا كنت تستخدم Latte خارج إطار عمل Nette، فستحتاج أولاً إلى إضافة الفلتر إلى المحرك الخاص بك:
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);
دعم سيمفوني 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)bindShared
singleton
في جسر Laravel (بواسطة sunspikes)bindShared
singleton
في جسر Laravel (بواسطة sunspikes)لا توجد ميزات جديدة أو إصلاحات للأخطاء، ولكن حان الوقت لضخ Slugify إلى الإصدار 1.0.
protected
(بواسطة acelaya)Ď
(بواسطة michalskop)Slugify
يقدم هذا الإصدار عمليات تكامل اختيارية في Symfony2 وSilex وTwig. لا يزال بإمكانك استخدام المكتبة في أي إطار آخر. قررت تضمين هذه الجسور نظرًا لوجود عمليات تكامل من مطورين آخرين، لكنهم يستخدمون إصدارات قديمة من cocur/slugify. إن تضمين فصول الجسر الصغيرة هذه في المكتبة يجعل صيانتها أسهل كثيرًا بالنسبة لي.
$separator
المفقودة إلى SlugifyInterface
تتم إعادة كتابة التعليمات البرمجية بالكامل تقريبًا، مما يزيل دعم iconv
لأن المكتبة الأساسية معطلة. أصبح الكود الآن أفضل وأسرع. شكرا جزيلا لمارشينكو الكسندر.
تم تعديل دعم اللغة الصينية من jifei/Pinyin بإذن.
Slugify هو مشروع من Cocur. يمكنك الاتصال بنا على تويتر: @cocurco
إذا كنت بحاجة إلى الدعم، يمكنك طرحه على Twitter (حسنًا، فقط إذا كان سؤالك قصيرًا) أو يمكنك الانضمام إلى الدردشة على Gitter.
في حال كنت ترغب في دعم تطوير Slugify، يمكنك مساعدتنا في توفير ترجمات صوتية إضافية أو إبلاغنا إذا كانت الترجمة الصوتية خاطئة. سنكون ممتنين للغاية لو تمكنت من إرسال طلب سحب إلينا مباشرةً على Github. إذا لم يسبق لك المساهمة في مشروع على Github، فنحن سعداء بمساعدتك. فقط أسأل على تويتر أو انضم مباشرة إلى Gitter.
يمكنك دائمًا مساعدتي (فلوريان، المطور الأصلي والمشرف) عن طريق إرسال يورو أو اثنين لي.
رخصة معهد ماساتشوستس للتكنولوجيا (MIT)
حقوق الطبع والنشر (ج) 2012-2017 فلوريان إكرستورفر
يُمنح الإذن مجانًا لأي شخص يحصل على نسخة من هذا البرنامج وملفات الوثائق المرتبطة به ("البرنامج")، للتعامل في البرنامج دون قيود، بما في ذلك، على سبيل المثال لا الحصر، حقوق الاستخدام والنسخ والتعديل والدمج. ونشر و/أو توزيع وترخيص من الباطن و/أو بيع نسخ من البرنامج، والسماح للأشخاص الذين تم توفير البرنامج لهم بالقيام بذلك، وفقًا للشروط التالية:
يجب تضمين إشعار حقوق الطبع والنشر أعلاه وإشعار الإذن هذا في جميع النسخ أو الأجزاء الكبيرة من البرنامج.
يتم توفير البرنامج "كما هو"، دون أي ضمان من أي نوع، صريحًا أو ضمنيًا، بما في ذلك، على سبيل المثال لا الحصر، ضمانات القابلية للتسويق والملاءمة لغرض معين وعدم الانتهاك. لا يتحمل المؤلفون أو أصحاب حقوق الطبع والنشر بأي حال من الأحوال المسؤولية عن أي مطالبة أو أضرار أو مسؤولية أخرى، سواء في إجراء العقد أو الضرر أو غير ذلك، الناشئة عن أو خارج أو فيما يتعلق بالبرنامج أو الاستخدام أو المعاملات الأخرى في برمجة.