FraFu: Pattern Syntax für preg_replace

Hallo!

Wiedermal ein Problem mit einer Pattern Syntax, bei der ich einfach nicht weiterkomme und nicht mal ansatzweise eine Lösung parat habe.

Gegeben ist ein String in dem Images wie folgt vorkommen:

  
<img width="120" height="86" align="left" src="http://localhost/project/view/thumb.php5?image_id=168" alt="alt text" />  

Daraus werden soll folgendes:

  
<a title="Klicke auf das Bild um das nächste anzuzeigen." rel="lightbox[set]" href="./view/medium.php5?image_id=168"><img width="120" height="86" align="left" title="klick mich an!" alt="alt text" src="./view/thumb.php5?image_id=168"></a>  

Dh. thumb.php5 wird durch medium.php5 ersetzt und drumherum wird ein a Tag gesetzt.

Ich habe ein preg_replace Statement, dass mir diese Arbeit bis zu einem gewissen Grad erledigt:

  
$str=preg_replace('~(?is)<img [^>]*src=(["\'])[^"\']+thumb.php5\?image_id=(\d+)(\\1)[^>]*>~',  
   '<a title="Klicke auf das Bild um das nächste anzuzeigen." rel="lightbox[set]" href="'.ROOT_PATH.'view/medium.php5?image_id=$2"><img title="klick mich an!" src="'.ROOT_PATH.'view/thumb.php5?image_id=$2"></a>', $str);  

Das preg_replace ignoriert aber alle Attribute außer src. Dh es gehen die Attribute width, height, align und alt verloren.
Wie muss ich das preg_replace erweitern, dass diese erhalten bleiben?

Ich hab in der PHP Doku zu Pattern Syntax, preg_replace usw. nachgelesen, ich finde aber leider keinen Ansatz um das Problem zu lösen.

mfg
  frafu

  1. hi,

    $str=preg_replace('~(?is)<img [^>]src=(["'])[^"']+thumb.php5?image_id=(\d+)(\1)[^>]>~',
       '<a title="Klicke auf das Bild um das nächste anzuzeigen." rel="lightbox[set]" href="'.ROOT_PATH.'view/medium.php5?image_id=$2"><img title="klick mich an!" src="'.ROOT_PATH.'view/thumb.php5?image_id=$2"></a>', $str);

    
    >   
    > Das preg\_replace ignoriert aber alle Attribute außer src. Dh es gehen die Attribute width, height, align und alt verloren.  
    > Wie muss ich das preg\_replace erweitern, dass diese erhalten bleiben?  
      
    Back-References bekommst du nur für das, wo du runden Klammern drumherum setzt.  
    [^>]\* mag zwar nach dem src="..." die restlichen Attribute erfassen - aber sie werden nicht "aufbewahrt", sind also futsch, können also auch beim Ersetzen nicht wieder eingefügt werden - ganz abgesehen davon, dass du das auch nicht mal versucht hast: Du ersetzt durch den Link mit title-, rel- und href-Attribut, sowie das darin liegende Bild mit title- und src-Attribut. Wenn die anderen Attribute erhalten bleiben sollten, müssten sie ja dort irgendwo wieder eingesetzt werden.  
      
    Also:  
    - besorge dir auch für den "Rest" eine Back-Reference  
    - füge diese im "Eränzungsstring" auch irgendwo sinnvoll ein  
      
      
    gruß,  
    wahsaga  
      
    
    -- 
    /voodoo.css:  
    #GeorgeWBush { position:absolute; bottom:-6ft; }