Parsing: RegEx mit '&', RegEx-Kenner gefragt

Kachelator

Peter Jerz
Hallo! Zunächst einmal: Ich habe keine Ahnung von PHP und nur ein wenig Erfahrung mit Regular Expressions.

Ich habe versucht, in einem mit PHP erstellten Forum das Einbinden von .aspx-Dateien (optional mit QueryStrings) als Images zu ermöglichen.
Also so etwas wie [Imagetag]h t t p://kachelator.europe.hosting.net/tracksigid.aspx?id=1058346[/Imagetag] sollte ebenso behandelt werden wie beispielsweise ein Jpg oder ein Gif. Da das entsprechende Aspx ein Bild zurückliefert, ist das an sich auch kein Problem. Nur der Parser des Forums machte mir zunächst Schwierigkeiten.

Für das Parsen von Image-Tags verwendet das Forum zur Zeit folgende Routine:
PHP:
 function parseimages ($text='') {
  $tags=$this->imagetags;
  foreach ($tags as $code) {
   $text=preg_replace("#\[".$code['tag']."]([^\"\?\&]*\.(gif|jpg|jpeg|bmp|png|aspx)[\?=a-z0123456789]*)\[\/".$code['tag']."\]#eiU","\$this->image('$code[ html ]','\\1')",$text);
   }
  return $text;
  }
Darin habe ich bereits aspx und [\?=a-z0123456789]* eingefügt, um Aspx mit Querystrings parsen zu lassen, und es klappt auch wunderbar.

Jetzt habe ich aber das Problem, dass ich meinem Aspx
zwei Querystrings übergeben will in der Form [Imagetag]h t t p://kachelator.europe.hosting.net/tracksigid.aspx?id=1058346&img=3[/Imagetag]
das funktioniert leider nicht, und zwar wegen des '&'. Ich habe zwar den entsprechenden Abschnitt in der "$text=" -Zeile folgendermassen angepasst, aber das scheint nicht zu helfen: [\&\?=a-z0123456789]* . (Ich habe halt das '&' noch eingefügt, damit es ebenfalls übernommen wird.)

Nun endlich meine Frage: Wie muss der reguläre Ausdruck aufgebaut sein, damit auch mehrere durch '&' getrennte Querystrings korrekt geparst werden?
Für Rat wäre ich sehr dankbar.
 
Probier mal bitte folgenden RegEx, bei mir funktioniert der
wunderbar. Habe das zwar nur mit dem RegexCoach getestet,
aber müsste gehen :

PHP:
([^\"?&]*.(gif|jpg|jpeg|bmp|png|aspx)[&?=\w\d]*)
 
Hm, ich habe es mal ausprobiert. Beim ersten Versuch habe ich das komplette Forum lahmgelegt, beim zweiten (nach Einfügen von ein paar '\\') wurden auch die einzelnen Querystrings nicht mehr geparst. Das habe ich reingesetzt:
PHP:
([^\"\\?\\&]*\\.(gif|jpg|jpeg|bmp|png|aspx)[\\&\\?\\=wd]*)
Oder muss ich auch w und d mit einem Backslash escapen, also so?
PHP:
([^\"\\?\\&]*\\.(gif|jpg|jpeg|bmp|png|aspx)[\\&\\?\\=\\w\\d]*)

---

Ich habe es einfach mal ausprobiert und festgestellt, dass die untere Variante ebenfalls nicht in der Lage ist, das '&' mitzuparsen. Schade.

Übrigens habe ich es da oben nicht geschafft, den Backslash vor dem doppelten Anführungszeichen sichtbar zu machen.
 
Zuletzt bearbeitet:
Das w und d müssen auch escaped werden.... sollen für Buchstabe und Ziffer stehen..... das Anführungszeichen müsste auch escaped werden, und nach dem Circumflex gehört auch ein Backslash....(wenn es die Zeichenklasse negieren soll) .... das Board verschluckt die Dinger immer gerne:-)
 
Mmmmh....Poste doch mal die ganze Klasse, damit man sieht, was dort vor sich geht:).... ach ne, lieber ranhängen, sonst sind die Backslashes wieder alle weg
 
Ich weiss nicht, was du mit Klasse meinst, da ich mich zwar gut mit C++ auskenne, mit PHP aber eher nicht. Ich hänge mal die Datei dran, wo die Parsersachen drin sind, okay? Die Stelle findet sich in der Funktion parseimages (Zeile 111) .
 

Anhänge

Hallo...

die Lösung ist einfacher als man denkt:-)
du musst zusätzlich zum Ampersand auch das Semikolon erlauben.

Warum....der komplette Text wird mit htmlentities() behandelt... da wird aus

PHP:
[ IMG]h t t p://kachelator.europe.hosting.net/tracksigid.aspx?id=1058346&img=3[ /IMG]
...jenes
PHP:
[ IMG]h t t p://kachelator.europe.hosting.net/tracksigid.aspx?id=1058346&img=3[ /IMG]
....du hast dann ein Semikolon in der URL.... welches bisher im RegExp nicht gestattet ist.
 
Waaaaahnsinn! Das hat sofort geklappt! Fatal gut!

Damit hast du einen kleinen PHP-Deppen (mich) sehr glücklich gemacht!

Danke, danke! :)
 
Zurück