Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP] alle Links automatisch vor der Ausgabe ändern (https://www.delphipraxis.net/34689-%5Bphp%5D-alle-links-automatisch-vor-der-ausgabe-aendern.html)

Delphi-Freak 26. Nov 2004 15:33


[PHP] alle Links automatisch vor der Ausgabe ändern
 
Halli Hallo! :)

Mal eine Frage zu PHP:
Gibt es irgendeine Möglichkeit, über PHP alle Links so abzuändern, dass hinten noch automatisch bei der Ausgabe zusätzliche Variablen hinzugefügt werden (so wie es bei Sessions automatisch gemacht wird, da wird "?PHPSESSID=..." bzw. "&PHPSESSID=..." hinzugefügt oder bei Formularen wird es über "<input type='hidden' name='PHPSESSID' value='...'>" gelöst)
Gibt es da irgendeine Funktion oder so, oder hat jemand eine Idee, wie man das über echo Ausgegebene abändern kann?

thankyouverymuch!!! :thumb:


LG

alcaeus 26. Nov 2004 17:28

Re: [PHP] alle Links automatisch vor der Ausgabe ändern
 
Hi Delphi-Freak,

als erstes muss ich erwähnen: der folgende Code funktioniert nur ab PHP 4.0.x.

Als erstes musst du diese Funktion in allen Dateien definieren:
Code:
//
// Append $SID to $url. Borrowed from phplib and modified
// Taken from phpBB 2.0.10, (c) by phpBB Group ([url]www.phpbb.com[/url])
//
function append_sid($url, $SID_name, $SID)
{
  if ( !empty($SID) && !preg_match('#'.$SID_name.'#', $url) 9
  {
    $url .= ( ( strpos($url, '?') != false ) ? '&amp;' '?' ) . $SID_name . '=' . $SID;
  }
  return $url;
}
Sie hängt an eine übergebene URL eine Session-ID an. $url ist die URL, $SID_name der Name der Sessionvariable und $SID der Inhalt.

Als nächstes muss der Code ganz oben vor die erste Ausgabe hin:
Code:
ob_start();
Dieser sorgt dafür, dass die Ausgabe gecached wird, und nicht sofort ausgegeben wird.

Und am Ende kommt dieser Code hin:
Code:
$contents = ob_get_contents();
ob_end_clean();

//
// Parts of this code property of Daniel R. Wolf of [url]www.delphipraxis.net[/url]
//
$segments = preg_split( '#(<a.+?</a>)#s', $contents, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
$contents = '';

foreach( $segments as $seg )
{
  if (strpos($seg, '<a') !== false)
  {
    $subsegments = preg_split( '#(href=".+?")#s', $seg, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
    $seg = '';
    foreach ( $subsegments as $subseg )
    {
      if (strpos($subseg, 'href') !== false)
      {
        $seg .= substr($subseg, 0, 6);
        $seg .= append_sid(substr($subseg, 6, -1));
        $seg .= '"';
      }
      else
      {
        $subseg .= $subseg;
      }
    }
    unset($subsegments);
  }
  contents .= $seg;
}
unset($segments);
echo $contents;
Was macht der nun? Zuerst holt er sich alles, was ausgegeben wurde und leert den Ausgabecache.
Als nächstes wird nach URL-tags gespaltet, und falls eines gefunden wurde, wird das href="..." herausgefiltert. Das wird anschließend so bearbeitet, dass die Session-ID angehängt wird. Anschließend wird alles nochmal mit echo ausgegeben (diesmal ohne Buffering, also endgültig). Sieh dir einfach die Befehlsreferenz zu den einzelnen Befehlen an, das sollte helfen.

Greetz
alcaeus

moritz 26. Nov 2004 17:31

Re: [PHP] alle Links automatisch vor der Ausgabe ändern
 
Ich denke mit Regulären Ausdrücken und preg_replace wäre dir auch gedient.

Delphi-Freak 26. Nov 2004 19:38

Re: [PHP] alle Links automatisch vor der Ausgabe ändern
 
Viiiiiiieeeeeeeeelen DANK!!!! :thumb:

@moritz: reguläre Ausdrücke alleine helfen nicht, da durch echo ein text sofort ausgegeben wird (außer über alcaeus' methode), trotzdem auch danke!

Noch einen schönen Abend!

Delphi-Freak 27. Nov 2004 12:12

Re: [PHP] alle Links automatisch vor der Ausgabe ändern
 
Noch eine letzte Meldung für andere Suchende:
Habe noch eine weitere Funktion gefunden: output_add_rewrite_var ( string name, string value)
Die muss man nur am Anfang vom Script hingeben, dann wird das für alle Links, Formulare usw. automatisch gemacht (bei Links z.B. ...). Natürlich kann man diese Funktion auch mehrmals aufrufen, dann werden halt mehrere Variablen hinzugefügt.
Funktioniert echt super! :-D

LG


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz