Ich baue eine vom Content unabhängige Verwaltung für <title>, <meta name="keywords" ...> und <meta name="description" ...>.
Man muss zu diesen drei Dingen noch einen URL-Pfad angeben, bei dem diese Daten verwendet werden sollen. In diesem Pfad sind ? und * als Platzhalter für ein beliebiges Zeichen bzw. beliebig viele Zeichen erlaubt.
Ich habe also viele Pfade wie
und zu jedem ein Set von Title, Keywords und Description.
Bei der Ausgabe im Frontend muss ich den Pfad finden, der am besten zur aktuellen URL passt. Wie stelle ich das am besten an?
Es ist nicht so, dass ich gar keine Idee hätte. Ich sortiere absteigend nach der Länge, ersetze dann "?" durch "[^/]{1}", "*?" und "?*" durch "[^/]{1,}", sowie "*" durch "[^/]*". Die umgeschriebenen Pfade verwende ich in der durch die Sortierung vorgebenen Reihenfolge in preg_match() bis ich einen Treffer habe.
Dieser erste Treffer ist nicht zwangsläufig der einzige oder beste. Zum Beispiel wird die Sortierung das ergeben:
Das ist schon nicht optimal. Ich will eigentlich "user/?*/profile/?" zuerst, weil es mir einen längeren Treffer garantiert als "user/?*/profile/*". Deswegen benutze ich eine Callback-Funktion zum Sortieren, die alle "*" entfernt und dann nach Länge entscheidet. Damit ergibt die Sortierung wie gewünscht
Nach dem Umschreiben in PCRE-Syntax habe ich
Jetzt gehts ans matchen.
Ist das überhaupt korrekt (Gegenbeispiele, Mehrdeutigkeiten)?
Wie kann ich das besser/effizienter lösen?
Man muss zu diesen drei Dingen noch einen URL-Pfad angeben, bei dem diese Daten verwendet werden sollen. In diesem Pfad sind ? und * als Platzhalter für ein beliebiges Zeichen bzw. beliebig viele Zeichen erlaubt.
Ich habe also viele Pfade wie
Code:
user/* user/?*/profile user/?*/profile/* user/?*/profile/?
Bei der Ausgabe im Frontend muss ich den Pfad finden, der am besten zur aktuellen URL passt. Wie stelle ich das am besten an?
Es ist nicht so, dass ich gar keine Idee hätte. Ich sortiere absteigend nach der Länge, ersetze dann "?" durch "[^/]{1}", "*?" und "?*" durch "[^/]{1,}", sowie "*" durch "[^/]*". Die umgeschriebenen Pfade verwende ich in der durch die Sortierung vorgebenen Reihenfolge in preg_match() bis ich einen Treffer habe.
Dieser erste Treffer ist nicht zwangsläufig der einzige oder beste. Zum Beispiel wird die Sortierung das ergeben:
Code:
user/?*/profile/* user/?*/profile/? user/?*/profile user/*
Code:
user/?*/profile/? user/?*/profile/* user/?*/profile user/*
Code:
user/[^/]{1,}/profile/[^/]{1} user/[^/]{1,}/profile/[^/]* user/[^/]{1,}/profile user/[^/]*
PHP-Code:
$bestMatch = NULL;
foreach ($paths as $path) {
if (preg_match('§^'. $path .'§', $_SERVER['REQUEST_URI'])) {
$bestMatch = $path;
break;
}
}
Wie kann ich das besser/effizienter lösen?
Kommentar