Vinzenz Mai: Regulärer Ausdruck

Beitrag lesen

Hallo Horst,

ich versuche Deine Beschreibung und Deinen Ansatz, die sich zum Teil widersprechen, unter einen Hut zu bringen.

Ich möchte alle Images der Form:
<img src="http://www.example.org/thumb.php?image_id=1234" alt="" />
ersetzen durch:
<a href="http://www.example.org/medium.php?image_id=1234">
  <img src="http://www.example.org/thumb.php?image_id=1234" alt="">
</a>

Wobei die ID der Images beliebig lang sein kann. Es muss auch egal sein, ob es sich um einfache oder doppelte Anführungszeichen handelt.

Mein Versuch:

$str='<img src="http://www.example.org/thumb.php?image_id=1234" alt="" />';
$str=preg_replace('/<imgthumb.php5?image_id=(\d+)['|"]\s/>/i', '<a href="http://www.example.org/medium.php5?image_id=$1"><img src="http://www.example.org/thumb.php5?image_id=$1"></a>', $str);


>   
> Klappt aber leider nicht.  
  
"Klappt nicht" ist keine Fehlerbeschreibung - allerdings bedeutet dies in Deinem Fall, dass keine Ersetzung vorgenommen wird.  
  
Dein Suchmuster lautet  
  
    '/\<img\*thumb.php5\?image\_id=(\d+)[\'|"]\s\*\/>/i'  
  
Reguläre Ausdrücke sind sicher nicht meine Stärke, aber mit Hilfe des Abschnittes [Reguläre Ausdrücke](http://de.selfhtml.org/perl/sprache/regexpr.htm) des Perlkapitels von SELFHTML habe ich das hinbekommen.  
  
1\. Fehler: Das Zeichen "<" ist kein Zeichen mit Sonderbedeutung, also muss es nicht maskiert werden.  
  
2\. Fehler:  
Hinter "img" verwendest Du "\*". Du erwartest also eine Folge von beliebig vielen (auch kein) "g" bis irgendwann "thumb" folgt. Die Zeichenkette dort wirfst Du übrigens unbeachtet weg, ich nehme einfach an, dass es sich um das Protokoll und die Domain handelt, die sich nicht ändern. In Wirklichkeit erwartest Du doch wohl eher ein  
  
  src=  
  
gefolgt von einem einfachen oder doppelten Anführungszeichen. Dazu später  
  
3\. Fehler:  
Die Zeichenkette, die Du durchsuchst lautet  
  
    <img src="http://www.example.org/thumb.php?image\_id=1234" alt="" />  
  
Wie willst Du dort ein "thumb.php5" finden?  
  
4\. Fehler  
Nach Deiner ID erwartest Du ein einfaches oder doppeltes Anführungszeichen. In eckigen Klammern befinden sich Alternativen, die Syntax wäre also  
  
    ['"]  
    nicht ['|"].  
  

> ist ein Sonderzeichen, das maskiert werden muss, im Kontext hier überflüssig ist.  
  
5\. und 6. Fehler  
Nach dem Anführungszeichen erwartest Du nach einem Leer- oder bestimmten Steuerzeichen eine beliebige Zeichenkette, die irgendwann von "/>" gefolgt wird. Du übersiehst, dass solche Suchmuster gierig sind (Fehler 5) und vergisst, dass Du diese Zeichenkette merken musst, um sie wieder einfügen zu können (Fehler 6).  
  
Als grundsätzlichen Fehler könnte man es ansehen, dass Du Suchmuster und Ersatzzeichenkette mit den Referenzen nicht Variablen zuweist sondern alles in eine dadurch sehr unübersichtliche Anweisung quetschst.  
  
Mit diesen meinen Hinweisen müsste es Dir möglich sein, den RegExp zu erstellen.  
  
  
Freundliche Grüße  
  
Vinzenz