Mailinglisten-Archive |
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