botl1k3: preg_replace - vereinfachen?

Hi,

ich bin noch ziemlich neu in Sachen regulärer Ausdrücke..
Ich möchte im Moment gerade <br />-Tags löschen, die in (Pseudo)Tables vorkommen.
Am einfachsten ist es wohl anhand eines Beispiels zu erklären:

Ich habe einen Sting, der z.B. so aussieht:
[tr]<br />[td]blub<br />[/td][td]<br />bl<br />a<br />[/td][/tr][tr][td]blubb[/td][td]blaa[/td][/tr]

Dieser Code wird Später mal in richtiges HTML umgewandelt, bei dem innerhalb eines tr-Elements ja keine br-Elemente erlaubt sind. Deswegen möchte ich diese entfernen.
Der Quellstring kann auch mal so aussehen:
<br />[tr] <br /><br /><br />[td]blub<br />[/td][td] <br />bl<br />a<br /> [/td][/tr][tr][td]blubb[/td][td]blaa[/td][/tr]
Also mehrere br-Elemente hintereinander.
Die br-Elemente innerhalb der td-Elemente, die nicht direkt nach dem Start-Tag oder vor dem End-Tag sitzen (abgesehen von whitespace), sollen beibehalten werden.

Dafür habe ich mir jetzt volgende pattern überlegt, die soweit auch funktionieren. Ich musste allerdings zwei benutzen:

  $content = preg_replace  ('=(\[/*t(r|d)\])\s*(<br />)+=Uis', '$1'  , $content);  
  $content = preg_replace  ('=(<br />)+\s*?(\[/*t(r|d)\])=Uis', '$2'  , $content);

Das Ergebnis der beiden Beispiele würde dann so aussehen:
[tr][td]blub[/td][td]bl<br>a[/td][/tr][tr][td]blubb[/td][td]blaa[/td][/tr]

Kann man das noch vereinfachen?

Gruß

  1. Hi,

    Dafür habe ich mir jetzt volgende pattern überlegt, die soweit auch funktionieren. Ich musste allerdings zwei benutzen:

    $content = preg_replace  ('=([/t(r|d)])\s(<br />)+=Uis', '$1'  , $content);

    $content = preg_replace  ('=(<br />)+\s*?([/*t(r|d)])=Uis', '$2'  , $content);

    
    > Das Ergebnis der beiden Beispiele würde dann so aussehen:  
    > `[tr][td]blub[/td][td]bl<br>a[/td][/tr][tr][td]blubb[/td][td]blaa[/td][/tr]`{:.language-html}  
      
      
    Obs einfacher ist, weiß ich nicht, aber wäre auch eine Möglichkeit:  
    ~~~php
      
    // Klammern:              |1      |2                |3  
    $content = preg_replace('~(\])?\s*(<br />\s*)+(?(1)|(\[))~i','\1\3',$content);  
    
    

    Wenn kein schließender Pseudo-Tag vor \s*(<br />\s*)+ kommt, muß ein schließender danach kommen, nur dann wird die Gruppe (2) und beliebig viele \s davor entfernt. Kann man natürlich noch erweitern t(d|r) usw.

    Gute Nachtruhe,
    Jonny 5

    1. Wenn kein schließender Pseudo-Tag vor \s*(<br />\s*)+ kommt, muß ein schließender danach kommen,...

      Meinte natürlich öffnender danach :D

      Jonny 5