voku/urlify

PHP port of URLify.js from the Django project. Transliterates non-ascii characters for use in URLs.


README

Build Status Coverage Status Codacy Badge Latest Stable Version Total Downloads License Donate to this project using Paypal Donate to this project using Patreon

🔗 URLify

Description

Convert any string into an valid and readable string for usage in the url.

This is a PHP port of "URLify.js" from the Django project + fallback via "Portable ASCII". We handles symbols from many languages via an matching-array and others via "ASCII::to_transliterate()".

Install via "composer require"

composer require voku/urlify

Usage:

namespace: "voku\helper\URLify"

To generate slugs for URLs:

echo URLify::filter(' J\'étudie le français ');
// "J-etudie-le-francais"

echo URLify::filter('Lo siento, no hablo español.');
// "Lo-siento-no-hablo-espanol"

To generate slugs for file names:

echo URLify::filter('фото.jpg', 60, '', true);
// "foto.jpg"

To simply transliterate characters:

echo URLify::downcode('J\'étudie le français');
// "J'etudie le francais"

echo URLify::downcode('Lo siento, no hablo español.');
// "Lo siento, no hablo espanol."

/* Or use transliterate() alias: */

echo URLify::transliterate('Lo siento, no hablo español.');
// "Lo siento, no hablo espanol."

To extend the character list:

URLify::add_chars(array(
  '¿' => '?', '®' => '(r)', '¼' => '1/4',
  '½' => '1/2', '¾' => '3/4', '¶' => 'P'
));

echo URLify::downcode('¿ ® ½ ¼ ¾ ¶');
// "? (r) 1/2 1/4 3/4 P"

To extend or replace the default replacing list:

URLify::add_array_to_seperator(array(
  "/®/"
));

echo URLify::filter('¿ ® ½ ¼ ¾ ¶');
// "12-14-34-P"

To extend the list of words to remove for one language:

URLify::remove_words(array('remove', 'these', 'too'), 'de');

To prioritize a certain language map:

echo URLify::filter(' Ägypten und Österreich besitzen wie üblich ein Übermaß an ähnlich öligen Attachés ', 60, 'de');
// "Aegypten-und-Oesterreich-besitzen-wie-ueblich-ein-Uebermass-aehnlich-oeligen-Attaches"
   
echo URLify::filter('Cağaloğlu, çalıştığı, müjde, lazım, mahkûm', 60, 'tr');
// "Cagaloglu-calistigi-mujde-lazim-mahkum"

Please note that the "ü" is transliterated to "ue" in the first case, whereas it results in a simple "u" in the latter.

Available languages

  • Arabic: 'ar'
  • Austrian (German): 'de_at'
  • Austrian (French): 'fr_at'
  • Azerbaijani: 'az'
  • Bulgarian: 'bg'
  • Burmese: 'by'
  • Croatian: 'hr'
  • Czech: 'cs'
  • Danish: 'da'
  • English: 'en'
  • Esperanto: 'eo'
  • Estonian: 'et'
  • Finnish: 'fi'
  • French: 'fr'
  • Georgian: 'ka'
  • German: 'de'
  • Greek: 'el'
  • Hindi: 'hi'
  • Hungarian: 'hu'
  • Kazakh: 'kk'
  • Latvian: 'lv'
  • Lithuanian: 'lt'
  • Norwegian: 'no'
  • Polish: 'pl'
  • Romanian: 'ro'
  • Russian: 'ru'
  • Serbian: 'sr'
  • Slovak: 'sk'
  • Swedish: 'sv'
  • Switzerland (German): 'de_ch'
  • Switzerland (French): 'fr_ch'
  • Turkish: 'tr'
  • Ukrainian: 'uk'
  • Vietnamese: 'vn'

Support

For support and donations please visit Github | Issues | PayPal | Patreon.

For status updates and release announcements please visit Releases | Twitter | Patreon.

For professional support please contact me.

Thanks

  • Thanks to GitHub (Microsoft) for hosting the code and a good infrastructure including Issues-Managment, etc.
  • Thanks to IntelliJ as they make the best IDEs for PHP and they gave me an open source license for PhpStorm!
  • Thanks to Travis CI for being the most awesome, easiest continous integration tool out there!
  • Thanks to StyleCI for the simple but powerfull code style check.
  • Thanks to PHPStan && Psalm for relly great Static analysis tools and for discover bugs in the code!