Sluggify PHP Strings zu URL-Slugs

Mit dieser statischen Klasse ist es möglich aus einem beliebigen PHP String einen s.g. Slug zu generieren. Dieser wird meistens für URLs genutzt, ist aber auch praktisch für Array-Keys und ähnliche Anwendungen.

Die Sluggifier Klasse beruht auf einem Kommentar von stackoverflow. Das gute an dieser Slug-Generierung ist, dass sie auch UTF-8 Zeichenketten in ASCII umwandelt.

Hinweis: Diese Funktion nutzt im Schritt (0) die Wordpress Funktion wp_trim_words(). Das funktioniert natürlich auch nur in einem Wordpress-Kontext! Wenn man den Sluggyfier so benutzen möchte, einfach die Zeile löschen und bei den Parametern das int $max_words = 15 entfernen.

Beispiel benutzung: $slug = Sluggifier::get( 'Ich will ein Slug werden!' );

<?php 
 
/**
 * Wandelt einen String in einen ASCII-URL-Slug um.
 * 
 * Methode wurde erweitert um die wp_trim_words()
 * Funktion, damit man den String vorher sinnvoll
 * auf Wortanzahl runter kürzen an.
 * 
 * Ursprung/Source: 
 * @link https://stackoverflow.com/questions/2955251/php-function-to-make-slug-url-string
 * 
 * Beispiel:
 *    $slug = Sluggifier::get( 'Ich will ein Slug werden!' );
 */
class Sluggifier 
{
	public static function get( string $text, string $divider = '-', int $max_words = 15 ):string
	{
		if( empty($text) ) { return 'n-a'; }
 
		$text = wp_trim_words( $text, $max_words, '' );          // (0) (Wordpress Funktion) Text auf Wortanzahl kürzen
 
		$text = preg_replace( '~[^\pL\d]+~u', $divider, $text ); // (1) Alles was keine Buchstaben oder Zahlen sind ersetzen
		$text = iconv( 'utf-8', 'us-ascii//TRANSLIT', $text );   // (2) umwandeln von utf8 zu ascii
		$text = preg_replace( '~[^-\w]+~', '', $text );          // (3) unerwünschte Zeichen entfernen
		$text = trim( $text, $divider );                         // (4) Leerzeichen am Ende & Anfang entfernen
		$text = preg_replace( '~-+~', $divider, $text );         // (5) Doppelte Divider löschen
		$text = strtolower( $text );                             // (6) Alles als Kleinschreibung
 
		return $text;
	}
}