URL mittels Regular Expression umschreiben - Fehler bei mehreren Parametern

Michael_K

Mitglied
Hallo,

ich habe hier ein Content Management System mit standardmäßig eher unschönen URLs, die ich umschreiben möchte. Ursprünglich sehen die Adressen so aus:

Code:
http://domain.de/cms/website.php?id=/de/index.htm

Wenn ich die HTML-Ausgabe abfange und folgende Regular Expressions darauf anwende, kommt eine solche Adresse raus:

Code:
http://domain.de/de/index.htm

PHP:
$strBuffer = preg_replace('#([\"\'])website\.php\?id=(/.+)(?:&|&)(.+)(\\1)#','\\1\\2?\\3\\4',$strBuffer);
$strBuffer = preg_replace('#([\"\'])website\.php\?id=(/[^\\1]+)(\\1)#U','\\1\\2\\3',$strBuffer);
$strBuffer = preg_replace('#([\"\'])\.\.(/.+\\1)#U','\\1\\2',$strBuffer);
Solang id der einzige Parameter bleibt, der in der URL übergeben wird, funktioniert alles einwandfrei. Allerdings gibt es mehrere Bereiche im CMS, die noch einen oder mehrere weitere Werte in der Adresse benötigen. Da die zusätzlichen Variablen in Anzahl und Namen beliebig sein sollen, reicht es mir, wenn einfach das erste Ampersand in ein Fragezeichen umgewandelt und mit allen anderen Parametern unverändert an die neue Adresse angehängt wird, also z.B. so:

Code:
http://domain.de/de/search.htm?action=search&searchterm=novelle&tagsearch=1

Daran verschluckt sich mein PHP-Code allerdings. Statt der obigen URL kommt Folgendes raus:

Code:
http://domain.de/de/search.htm&action=search&searchterm=novelle?amp;tagsearch=1

Hat jemand eine Idee, was ich ändern muss, um diesen Fehler zu beheben?

Viele Grüße
Michael
 
item: Warum programmierst du das in PHP? Dazu gibts Rewrite im .htaccess.

Willst du aus dem Pfad-Aufruf ein Parameter-Aufruf machen oder umgekehrt?
 
Das CMS ist eine angepasste Version von OpenEngine, die eigentlich nie für derartige Späße ausgelegt wurde. Deswegen ist der klassische URL-Aufbau (website.php?id=) in vielen Dateien fest eingetragen. Würde ich die alle manuell in meine Wunschadresse umschreiben, säße ich einerseits eine Ewigkeit an dieser Aufgabe, andererseits würde ich mich der Möglichkeit berauben, auf die alten Adressen zurückzugreifen, sollte das aus irgendwelchen Gründen einmal notwendig sein.

Daher speichere ich jede Ausgabe des CMS erstmal via ob_start() in einem Puffer zwischen und jage diesen durch den oben beschriebenen Code, um nachträglich alle Adressen mit website.php?id=... in meine Wunschadressen umzuwandeln. Beim Klick auf einen dieser neuen Links kommt dann natürlich htaccess zum Einsatz, um die die URL wieder in die Form zurückzuwandeln, die das Redaktionssystem versteht. Der .htaccess-Code kommt bereits auch ohne Probleme mit weiteren angehängten Parametern klar - mein Problem ist also nur diese nachträgliche Adressenumwandlung durch PHP.

Hoffe ich habe jetzt alle Klarheiten beseitigt? :)
 
Soweit klar.

Und wie sollte die Pfad-URL den für dein Beispiel aussehen?
so?
Code:
http://domain.de/cms/website.php?id=/de/search.htm&action=search&searchterm=novelle&tagsearch=1
//zu
http://domain.de/de/search.htm?action=search&searchterm=novelle&tagsearch=1

Auf die Schnelle getestet
PHP:
<?php
error_reporting(E_ALL);

// Text bzw. String der durchsucht werden soll 
$string = <<<EOF
http://domain.de/de/search.htm?action=search&searchterm=novelle&tagsearch=1
EOF;

// das Suchmuster mit Delimiter und Modifer (falls vorhanden) 
$pattern = '/^http:\/\/domain\.de\/cms\/website\.php\?id=([^&]+)(?:&(.*)|)$/i';

// Ersatzstring 
$ersatz = 'http://domain.de$1?$2';

// RegEx mit preg_replace() auswerten 
echo preg_replace($pattern, $ersatz, $string );

// ggf. auch: 
// echo preg_replace(, htmlentities(), ); 

?>
 
Vielen Dank für Deine Antwort und sorry für meine verspätete Reaktion. Ich bin leider erst jetzt wieder dazu gekommen, mich mit dem Problem zu beschäftigen.
Ich habe Dein Suchmuster so abgewandelt, dass es unabhängig von der verwendeten Domain funktioniert. Rausgekommen ist dabei das:
PHP:
$strBuffer = preg_replace( '#([\"\'])website\.php\?id=([^&]+)(?:(&amp;|&)(.*)|)$#m' , '$1$2?$4' ,  $strBuffer );
Dieses Muster funktioniert wunderbar, was die URLs betrifft. Allerdings vergreift es sich auch an anderen maskierten Sonderzeichen wie Umlauten - aus einem "Ü" wird nun z.B. ein "?Uuml;" und ein "&nbsp;" wird zu einem "?nbsp;". Hast Du mir vielleicht noch einen Tipp, wie ich das beheben kann?
 
Zurück