Der Martin: Links kenntlich machen

Beitrag lesen

Hallo,

Hi,
[...]
Ciao,
Martin

wenn du dir jetzt auch noch diese ärgerlichen Vollzitate abgewöhnst, sind wir wieder ein Stück weiter. ;-)

Ich will nicht vormucken aber ich glaube ein interessanter Part im Code ist wohl:

<a href='http://www.bild.de' target='_blank'>www.bild.de</a>

Das ist tatsächlich interessant - und falsch. Wenn die Backslashes, mit denen Anführungszeichen in PHP maskiert werden, plötzlich noch im HTML-Code auftauchen, ist etwas faul. Und es führt exakt zu dem Verhalten, das dich stört: Der Inhalt des href-Attributs beginnt mit einem einfachen Anführungszeichen, wird also relativ zur Basis-URL des Dokuments betrachtet.

<link rel="stylesheet" href="../Hintergrundstyle-01.css" type="text/css">

Tipp: Vermeide Großbuchstaben in URLs. Das ist eine häufige Fehlerquelle, weil die meisten Webserver unter Linux laufen und dieses System exakt zwischen Groß- und Kleinschreibung unterscheidet. Das heißt, eine Datei, die als "image038.JPG" auf dem Server liegt, wird unter "image038.jpg" nicht gefunden.

<body link="#800000" vlink="#800000" alink="#800000">

Meide veraltete HTML-Attribute zur Gestaltung; konzentriere von Anfang an alles, was Gestaltung ist, auf CSS.

<a name="Seitenanfang"> </a>

Wozu das? Erstens ist ein a-Element mit name als Verweisziel ein Relikt aus dem letzten Jahrtausend (normalerweise nimmt man ein ID-Attribut eines beliebigen Elements als Verweisziel), zweitens ist der Seitenanfang immer mit dem namenlosen Anker "#" erreichbar.

</div>

<tr>

Das ist kein korrektes HTML. Das table-Element hast du schon geschlossen, da kann nicht plötzlich wieder ein verwaistes tr auftauchen.

<td>
     <a href='http://www.bild.de' target='_blank'>www.bild.de</a>
    </td>

Ah, da ist er ja.

<div id="gb_delete_link">
      <a href ="gaestebuch-administration.php" onclick="FensterOeffnen(this.href);
        return false">Eintrag löschen</a>
     </div>
    </div>
  </tr>

Auch das ist ungültiges HTML: Ein div-Element kann nie direktes Kindelement von tr sein.

<tr>
   <div id="gb_background_eintrag">
    <td>

Ach, so sieht der fehlerhafte Anfang dazu aus. Hatte ich weiter oben übersehen. Und noch ein Fehler: Eine ID muss dokumentweit einzigartig sein und darf nicht mehrmals vergeben werden.

</div title="schließt content_members_area">
</div title="schließt gesamt_kurz">

Das ist in HTML auch nicht erlaubt: Attribute im schließenden Tag.

Also fassen wir zusammen: Du hast ungültiges (fehlerhaftes) HTML, aber das hat nichts mit den falsch erzeugten Links zu tun. Aber bist du ganz sicher, dass du die Strings in den preg_replace()-Aufrufen mit doppelten und nicht mit einfachen Anführungszeichen geschrieben hast?

$link = preg_replace(
"/([\w]+://[\w-?&;#~=./@]+[\w/])/i","<a href='http://$1' target='_blank'>$1</a>", $link);

$link = preg_replace(
"/([\w-?&;#~=./]+@([?)[a-zA-Z0-9-.]+.
([a-zA-Z]{2,3}|[0-9]{1,3})(]?))/i","<a href='mailto:$1'>$1</a>",$link);

Abgesehen davon sind die Backslashes in den Replace-Strings sowieso völlig unnötig, und im Suchmuster werden sie nur "zufällig" korrekt interpretiert, weil PHP sie nicht missverstehen *kann*. Ich würde allerdings beide Strings -also sowohl Suchmuster als auch Ersetzung- in einfache Anführungszeichen setzen, damit nicht irgendwelche PHP-Escapes dazwischenfunken. Und dann innerhalb des Ersetzungs-Strings doppelte Anführungszeichen (ohne Maskierung).

Und noch eine Sache zum Schluss: Ich weiß, es war nur als Beispiel gedacht. Die BILD-Zeitung findet es aber vermutlich nicht lustig, wenn du deren Domain als Beispiel verwendest. Dafür gibt es extra die abstrakten Beispiel-Domains example.org, example.net, example.com oder *.example.

Ciao,
 Martin

--
F: Was ist eigentlich aus deinem schlimmen Durchfall geworden?
A: Mein Arzt hat mir Valium verschrieben.
F: Und das hilft?
A: Naja, ich mach mir immer noch in die Hose. Aber inzwischen ist es mir egal.
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(