Umlaute und Sonderzeichen aus Strings entfernen

Quell-ID: GitHub Discussion #31

Use Case

Ein String mit Umlauten und Sonderzeichen soll normalisiert werden, um ihn als Dateinamen oder HTML-Anker (ID) verwenden zu können.

Verwendete AddOns

  • REDAXO Core

Beispiele

Eingabe: "wichtige-Datön&Fäkten.pdf"
Ausgabe: "wichtige_datoen_faekten"

Eingabe: "Sprüng-Märke"
Ausgabe: "sprueng_maerke"

Lösung

REDAXO bietet die Funktion rex_string::normalize():

<?php
$fileName = rex_string::normalize('wichtige-Datön&Fäkten');
// Ergebnis: "wichtige_datoen_faekten"

Anwendung als HTML-Anker

<?php
$anchor = rex_string::normalize('Sprüng-Märke');
?>

<a href="#<?= $anchor ?>">Zum Abschnitt springen</a>

<div id="<?= $anchor ?>">
    Inhalt des Abschnitts
</div>

Verhalten von rex_string::normalize()

Die Funktion:

  • Konvertiert Umlaute (ä → ae, ö → oe, ü → ue, ß → ss)
  • Entfernt Sonderzeichen
  • Ersetzt Leerzeichen und Bindestriche durch Unterstriche
  • Konvertiert in Kleinbuchstaben
  • Entfernt mehrfache Unterstriche

Weitere String-Funktionen

rex_string::sanitizeHtml()

Bereinigt HTML für sichere Ausgabe:

$safe = rex_string::sanitizeHtml($unsafeHtml);

rex_string::buildQuery()

Erstellt einen URL-Query-String:

$query = rex_string::buildQuery(['page' => 1, 'sort' => 'name']);
// Ergebnis: "page=1&sort=name"

rex_string::highlight()

Hebt Suchbegriffe hervor:

$text = rex_string::highlight($text, $searchTerm, '<mark>$1</mark>');

Besserer Ansatz für spezifische Anwendungsfälle

Für Dateinamen

<?php
function sanitizeFilename(string $filename): string
{
    // Dateiendung extrahieren
    $extension = pathinfo($filename, PATHINFO_EXTENSION);
    $basename = pathinfo($filename, PATHINFO_FILENAME);
    
    // Basisnamen normalisieren
    $sanitized = rex_string::normalize($basename);
    
    // Mit Dateiendung zurückgeben
    return $sanitized . ($extension ? '.' . strtolower($extension) : '');
}

// Verwendung
$cleanName = sanitizeFilename('Mein Dokument (v2).PDF');
// Ergebnis: "mein_dokument_v2.pdf"

Für URL-Slugs mit Bindestrichen

<?php
function createSlug(string $text): string
{
    // Erst normalisieren
    $slug = rex_string::normalize($text);
    
    // Unterstriche durch Bindestriche ersetzen
    $slug = str_replace('_', '-', $slug);
    
    // Mehrfache Bindestriche entfernen
    return preg_replace('/-+/', '-', $slug);
}

// Verwendung
$slug = createSlug('Mein schöner Artikel-Titel!');
// Ergebnis: "mein-schoener-artikel-titel"

Für HTML-IDs (streng)

<?php
function createHtmlId(string $text): string
{
    $id = rex_string::normalize($text);
    
    // IDs dürfen nicht mit einer Zahl beginnen
    if (preg_match('/^[0-9]/', $id)) {
        $id = 'id-' . $id;
    }
    
    return $id;
}

Hinweis

rex_string::normalize() ist speziell für deutsche Umlaute optimiert. Für andere Sprachen oder komplexere Anforderungen kann die PHP-Intl-Extension mit Transliterator verwendet werden:

<?php
$transliterator = Transliterator::create('Any-Latin; Latin-ASCII; Lower()');
$ascii = $transliterator->transliterate('Müller Ñoño');
// Ergebnis: "muller nono"