PHP Regex für valide W3C Links (& zu &)

TDS

Webbie u. Progger
ID: 36770
L
25 April 2006
1.473
61
Hallo,

laut W3C sollten ja alle URLs mit Attributen & und nicht & als Trenner benutzen. Nur leider ist das rückwirkend auf sehr große Projekte nachträglich nicht machbar alles manuell zu ersetzen.

Was ich bis jetzt habe ist folgendes:
  • alle URLs suchen die als Attribute src oder href haben
    Code:
    (src|href)\s*=\s*[\"|'](.*?)[\"|']
  • durchsuche diese URLs ob nur & als Trenner und nicht & (inkl. XML-Syntax falls vorhanden => UTF-Nummer)
    Code:
    (&(?!(?i:\#((x([\dA-F]){1,5})|(104857[0-5]|10485[0-6]\d|1048[0-4]\d\d|104[0-7]\d{3}|10[0-3]\d{4}|0?\d{1,6}))|([A-Za-z\d.]{2,31}));))
Die Frage ist: Kann man diese zwei Regex zusammenfassen so das unsere Entwicklungsumgebung (bzw. der Dateimanager) via Regex-Suche alles für uns findet?

Gruß TDS
 
in einer Unix/Linux Umgebung kann man da schnell mit egrep und sed arbeiten.
Das sehr zuverlässig und schnell, egal wie groß Dateien sind, und wieviele !!!
 
in einer Unix/Linux Umgebung kann man da schnell mit egrep und sed arbeiten.
Das sehr zuverlässig und schnell, egal wie groß Dateien sind, und wieviele !!!

Das sollte nicht das Problem darstellen. Würde wenn dann sed oder nen Shellscript bevorzugen. Idee? (Grundlage ist Debian)
 
nen shell Skript geht ja immer sogar mit rekursion.
Solltest Dich ein wenig belesen, nicht einfach nur nach einer fertigen Lösung fragen.
sed hat auch RA Erkennung mit gleichzeitiger Ersetzung des Matches !

Ansonsten beschreib einfach mal, warum es nicht sequenziell laufen soll, so wie atm...
 
aus deinem Posting entnehme ich mal, das die php-Funktion htmlentities() ebenso ausreichend sein sollte ;)
Wäre, falls es bei dir möglich ist, die einfachste Variante.
 
Ich habe eigentlich schon gezweifelt, ob wir nicht aneinander vorbei reden.

Achja, auch wenn ich deinen Einwand "mit etwas Neuem beschäftigen" gut finde ist es wirklich unnötig und in anderen PHP-Versionen evtl. unkompatibel, wenn man sowas über regex, shellscript auf das gesamte Script anwenden will.

Oder reden wir doch aneinander vorbei ? :p
 
also wenn du mit sed noch keine Erfahrung gesammelt hast, würde ich auch Dir mal das Studieren der Man Page von sed, oder ein paar Tut's auszuprobieren, empfehlen. Vor allem wenn man sein Shell Skript so baut, das man den RA austauschen kann, sei es der RA ist in einer Variablen gespeichert, oder wird aus $1 (Paramterübergabe) ausgelesen und benutzt. Setzt voraus, das der RA auch korrekt ist...

Schon klar, so einfach wie möglich spart Zeit, aber Neues dazulernen sollte man immer, oder seinen Horizont erweitern.
Ich war selbst überrascht, wie effektiv sed sein kann.
Mit einem 1zeiler kann man soviel machen...
 
aus deinem Posting entnehme ich mal, das die php-Funktion htmlentities() ebenso ausreichend sein sollte ;)
Wäre, falls es bei dir möglich ist, die einfachste Variante.
Klappt nicht. Beispiel: ca. 4.000 Dateien, davon 2.500 PHP und ca. 500 XML. Wenn ich dann nen Link mit dem oben genannten Regex finde, und htmlentities / htmlspecialchars / urlencode, etc mache, dann wird auch & ersetzt was zu & führt.
Ich habe eigentlich schon gezweifelt, ob wir nicht aneinander vorbei reden.

Achja, auch wenn ich deinen Einwand "mit etwas Neuem beschäftigen" gut finde ist es wirklich unnötig und in anderen PHP-Versionen evtl. unkompatibel, wenn man sowas über regex, shellscript auf das gesamte Script anwenden will.

Oder reden wir doch aneinander vorbei ? :p
Finde auch es sollte normales POSIX-Regex sein (oder PCRE). So brauche ich weder Shell noch ein extra Script. Dann kann ich auch wie oben beschrieben mit externen Programmen suchen.
 
Wenn aus & & wird ist am regulären ausdruck was faul.
Das heißt, du mußt auf die Möglichkeit eines &amp suchen, nicht nur allein eines &.
Das heißt sowieso Du mußt splitten.

1> Suchedas nächste Vorkommen von und
2> prüfe ob &amp -> nein: dann &amp , sonst nix

Warum macht man es sich nur immer so unnötig schwer...
 
Wenn aus & & wird ist am regulären ausdruck was faul.
Das heißt, du mußt auf die Möglichkeit eines &amp suchen, nicht nur allein eines &.
Das heißt sowieso Du mußt splitten.

1> Suchedas nächste Vorkommen von und
2> prüfe ob &amp -> nein: dann &amp , sonst nix

Warum macht man es sich nur immer so unnötig schwer...

Ähm, hast du mal meinen Post gelesen???
Code:
(&(?!(?i:\#((x([\dA-F]){1,5})|(104857[0-5]|10485[0-6]\d|1048[0-4]\d\d|104[0-7]\d{3}|10[0-3]\d{4}|0?\d{1,6}))|([A-Za-z\d.]{2,31}));))
Dieser Regex macht genau das erwartete. & zu & wenn nicht schon & oder ein -Derivat gewesen.