phpbar.de logo

Mailinglisten-Archive

[php] Druckansicht auf PHP::BAR (ap)

[php] Druckansicht auf PHP::BAR (ap)

Johannes Schlueter schlueter at phpbar.de
Mon Okt 6 00:56:33 CEST 2003


Hi Alexander,

On 5 Oct 2003 at 23:12, Alexander Palm wrote:
> Auf der php::bar-Seite ist ja auch eine sehr schöne Druckansicht wo auch
> die LINKS rausgeschnitten und in der Legende angezeit werden... Wie wird
> das wohl gemacht?

Waere es nicht vielleicht sinniger die Macher 
zu fragen und nicht irgendwelche Leute, die 
das vielleicht noch nichtal bemerkt haben? ;-)
Nunja ich werde mal trotzdem etwas aus dem 
Nähkästchen plaudern:
Zentral für diese Lösung ist dieser Aufruf:
$content = preg_replace_callback(
  '%<a href="(.+)">(.+)</a>%imsU',
  array(&$this, 'rewriteLinksPrint'),
  $content);
(Der Überischt wegen habe ich den RegExp etwas 
gekürzt, im original sollte der auch mit sowas 
klar kommen:
 <a class="..." href='...' foo="bar">...</a>
Somit wird bei jedem Link die Methode 
rewriteLinksPrint() Aufgerufen (siehe Doku von 
preg_replace_callback()) diese sieht so aus:

function rewriteLinksPrint($link) {
  $link[2] = $this->link2url($link[2]);

  if (($pos = array_search($link[2],
                  $this->links)) !== false) {
    $pos++;
  } else {
    $this->links[] = $link[2];
    $pos = sizeof($this->links);
  }
  return '<b'.$link[1].' '.$link[3].'>'.
         $link[4].'['.$pos.']</b>';
}

Jetzt wieder die Frage was die macht, relativ 
einfach: Sie nimmt den gefundenen Link 
entgegen, formatiert den enthaltenen Link um 
(geanuer: Das macht die Methode link2url(), 
und zwar werden da so ersetzungen gemacht wie 
/foo wird zu http://www.phpbar.de/foo und 
lauter solche Scherze - da die aber noch 
ein/zwei Bugs hat und nicht ganz so schön ist 
spare ich mir das Posten *g*) Dann durchsucht 
die rewriteLinksPrint() ein Array $this->links 
und schaut ob der aktuelle Treffer schon drin 
ist, wenn ja wird die Position gemerkt, 
ansonsten neu eingefügt. Als Rückgaewert gibt 
es den "umformatierten" Link mit angehängter 
Positions-Nummer, der wird dann von der 
preg_replace_callback entgegen genommen und 
anstatt des Linkes eingesetzt. Ganz am Ende 
der Ausgabe wird das $this->links Array 
ausgelesen und die Linkliste gebastelt.

Also zusammenfassend: Der zentrale Trick ist 
preg_replace_callback mit einem Callback, der 
alle Links durchnummeriert. Die 
Implementierung hier entstamt 'nm schnellen 
Hack (wobei ich doch recht lange getüfftelt 
habe bis es lief) muss also nicht umbedingt 
die beste Lösung sein.

Hoffe geholfen zu haben,

johannes
php::bar Core-Team

P.S. Falls es Dir weitergeholfen hat: 
http://www.schlueters.de/ich/danke.php ;-)
(Das muss auch mal erlaubt sein)

php::bar PHP Wiki   -   Listenarchive