Zeichnsatz, RegExp
Tom
- php
Hello,
ich habe da noch eine kleine Reparatur in einer alten Webseite vorzunehmen. Ein Witzbold hat dort wie folgenden ausgeführte Links eingestzt:
<A HREF="abdrücken.html" OLDREF=" lexikon/a/abdr%FCcken.html">Abdrücken</A></p>
Kann ich davon ausgehen, dass es "OLDREF" als Attribut nicht gibt und nicht gab?
Nun muss ich aber genau den rawurl-codierten Linktext wieder im HREF-Attribut haben. Dafür benötige ich mal etwas Unterstützung für den Aufbau der Hyperreferenz.
Es müssten also (vermutlich) in den über 1900 Dokumenten alle HREF ersetzt werden, die HTML-Entitäten enthalten, denn die dürfen nicht in der URL auftauchen...
Außerdem würde ich bei dieser Gelgenheit auch gleich das "OLDREF" entfernen wollen.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi Tom,
Kann ich davon ausgehen, dass es "OLDREF" als Attribut nicht gibt und nicht gab?
Ja.
Es müssten also (vermutlich) in den über 1900 Dokumenten alle HREF ersetzt werden, die HTML-Entitäten enthalten, denn die dürfen nicht in der URL auftauchen...
Doch, dürfen sie.
Live long and prosper,
Gunnar
Hello,
Es müssten also (vermutlich) in den über 1900 Dokumenten alle HREF ersetzt werden, die HTML-Entitäten enthalten, denn die dürfen nicht in der URL auftauchen...
Doch, dürfen sie.
Aber sie funktionieren nicht.
Außerdem müsste das & ja codiert werden. Es ist schlielich Bestandteil der URL und nicht Steuerzeichen für den URi
Liegt es vielleicht daran?
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi Tom,
Außerdem müsste das & ja codiert werden.
?? Du willst die Ressource http://example.net/ä referenzieren?
Das geht mit
<a href="http://example.net/ä">
genauso wie mit
<a href="http://example.net/ä">
Live long and prosper,
Gunnar
Hello,
Außerdem müsste das & ja codiert werden.
?? Du willst die Ressource http://example.net/ä referenzieren?
Das geht mit
<a href="http://example.net/ä">
genauso wie mit
<a href="http://example.net/ä">
Genauso geht es... nämlich gar nicht!
Das & ist ein Sinderzeichen, dass in URLs nix zu suchen hat. Es gehört in die URi, und zwar als Steuerzeichen für die Parameter-Segmentierung. Das ist aber Sache des jeweiligen Webservers.
Mein Problem ist auch nicht, ob es unter bestimmten Umständen zulässig ist oder nicht. Ich will es schlichtweg nicht so haben und suche daher eine passende RegExp, die mir hilft, die betroffenen URLs umzuwandeln von Entities auf RawUrlEncoded Strings.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Das & ist ein Sinderzeichen, dass in URLs nix zu suchen hat.
Tom,
Mir ist dein Problem nicht ganz klar.
Kommt "&" im Dateinamen der Ressource vor?
Wenn ein "ä" im Dateinamen vorkommt, kannst du selbstverständlich im HTML-Quelltext <a href="http://example.net/ä">
schreiben. Das wird ja nicht so rausgeschickt; sondern der Browser wandelt ä in ä um, so dass "http://example.net/ä" rausgeschickt wird. Der Server bekommt überhaupt nicht mit, wie das "ä" im Quelltext steht.
Live long and prosper,
Gunnar
Hello,
Wenn ein "ä" im Dateinamen vorkommt, kannst du selbstverständlich im HTML-Quelltext
<a href="http://example.net/ä">
schreiben. Das wird ja nicht so rausgeschickt; sondern der Browser wandelt ä in ä um, so dass "http://example.net/ä" rausgeschickt wird. Der Server bekommt überhaupt nicht mit, wie das "ä" im Quelltext steht.
Der Browser weigert sich aber in immer noch erheblicher Anzahl vertretener Exemplare, das 'ä' im Ressource-String überhaupt abzuschicken. Und deshalb muss es meiner Meinung nach mit rawurlencode() (PHP) behandelt werden.
Jedenfalls funktioniren die so behandelten Links erwartungsgemäß einwandfrei, während die mit den Umlauten nicht funktionieren. Auch wenn der Browser den Request vermeintlich abschickt, erhalte ich nur einen 404er.
Das mag dann wiederum am Server liegen. Vielleicht versickert die richtige Codierung ja aber auch auf der Strecke? Es ist mir zu müßig, sowas zu verfolgen, wenn man durch passende Codierung das Problem mit der Wurzel ausreißen kann.
Gesucht sit also eine RegExp, die mir alle Vorkommen von "<a href="äöüß" ...> findet und daraus eine Hyperreferenz mit RawURL-Codiertem String macht.
Das äöüß steht jetzt hier nur als Platzhalter für die verbotenen Zeichen und außerdem als Platzhalter für die HTML-codierten Zeichen, also ä Ä ...
Die muss ich dann ja wohl erst wieder zurückverwandeln, um sie anschließend mit rawurlencode() behandeln zu lönnen.
Als zweite Aufgabe ist noch das Entfernen von OLDREF=" ... " zu erledigen ;-)
Da es sich um ca. 2000 Dokumente in Verzeichnissen und Unterverzeichnissen handelt, möchte ich das händisch erledigen.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hello,
Es müssten also (vermutlich) in den über 1900 Dokumenten alle HREF ersetzt werden, die HTML-Entitäten enthalten, denn die dürfen nicht in der URL auftauchen...
Doch, dürfen sie.
http://www.domain.tld/lexikon/a/abk&uuml;hld.html
funktioniert nicht.
Nur die rawurl-encodete Form funktioniert und das ist auch plausibel.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi,
<A HREF="abdrücken.html" OLDREF=" lexikon/a/abdr%FCcken.html">Abdrücken</A></p>
Kann ich davon ausgehen, dass es "OLDREF" als Attribut nicht gibt und nicht gab?
Ja.
Nun muss ich aber genau den rawurl-codierten Linktext wieder im HREF-Attribut haben. Dafür benötige ich mal etwas Unterstützung für den Aufbau der Hyperreferenz.
Es müssten also (vermutlich) in den über 1900 Dokumenten alle HREF ersetzt werden, die HTML-Entitäten enthalten, denn die dürfen nicht in der URL auftauchen...
Du willst also alles nach HREF=" weghaben bis zum Leerzeichen nach OLDREF="
==>
/HREF=".*?OLDREF=" /
durch href=" ersetzen.
Oder soll das lexikon/a auch noch weg? Dann halt noch in den match mitreinnehmen.
cu,
Andreas
Hello,
Du willst also alles nach HREF=" weghaben bis zum Leerzeichen nach OLDREF="
==>
/HREF=".*?OLDREF=" /
durch href=" ersetzen.Oder soll das lexikon/a auch noch weg? Dann halt noch in den match mitreinnehmen.
Das Problem ist, dass der einzig abgesicherte Link in HREF=" ... " drinsteht, aber eben leider oft mit der falschen Codierung. Ich müsste also feststellen, ob dort gültige HTML-Entities drinstehen, die rückkodieren und gegen RawUrlEndode() ersetzen.
Den OLDREF kann ich dann vollständig entfernen.
Was mir noch Schwierigkeiten bereitet, ist festzustellen, ob in der HREF eine HTML-Entität drinsteht oder nicht.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Heißa, Tom,
Was mir noch Schwierigkeiten bereitet, ist festzustellen, ob in der HREF eine HTML-Entität drinsteht oder nicht.
Du musst das ja nicht alles mit einem preg_replace durchführen, oder? Ich würde an deiner Stelle erstmal mit preg_match_all alle Links heraussuchen und dann mit Stringfunktionen oder sonstwie jede Adresse einzeln auf gültige Entities überprüfen. Sollte sich eigentlich nicht so schwierig gestalten.
Und dann wird dir sicherlich das e-Flag für preg_replace nützlich sein.
Gautera!
Grüße aus Biberach Riss,
Candid Dauth