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