Ankündigung

Einklappen
Keine Ankündigung bisher.

Preg_replace: th in td entfernen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Preg_replace: th in td entfernen

    Guten Morgen!

    Ein Wordpressplugin (GravityForms) erstellt mir automatisiert folgende Tabelle in einer Tabelle(gekürzt):

    PHP-Code:
    <table><tbody><tr><td>
    <
    table><thead>
    <
    tr><th>Überschrift1</th><th>Überschrift2</th><th>Überschrift3</th></tr>
    </
    thead>
    <
    tbody>
    <
    tr><td>Content1</td><td>Content2</td><td>Content3</td>
    .... 
    Ich möchte jetzt Überschrift 2 & Überschrift 3 als auch Content 2 & Content 3 entfernen.

    Folgendes Pattern habe ich zusammengestellt:
    PHP-Code:
    preg_replace("/<(?:td|th)[^>]*>.*?<\/(?:td|th)>\s+<\/tr>/i""</tr>"$table); 
    Quelle

    Wenn ich das 2x anwende, verschwinden Content 2 & Content 3 erfolgreich.
    Jedoch schaffe ich es nicht, auch die Überschrift 2 & Überschrift 3 zu löschen, obwohl ich ebenfalls th in dem Pattern verwende.

    Wenn ich das Pattern auf eine 'normale', also keine Tabelle in einer Tabelle anwende, funktioniert es wie erwartet. (d.h. th und td werden gleichzeitig entfernt)

    Demo für die einfache Tabelle, funktionierendes Beispiel

    Die Frage:
    Wie kann das Pattern so geändert werden, dass ebenfalls Überschrift2&3 gelöscht werden?

    Ideen? Lösungsvorschläge? Hinweise?
    Falls eine weitere Demo benötigt wird oder weitere Details, einfach bescheid geben, stelle ich gerne zur Verfügung.


  • #2
    - Das Markup scheint (in der dargestellten Form) kaputt zu sein:

    PHP-Code:
    <table><tbody><tr><td
    - preg-Escaping immer mit 2 Backslashes.

    - Der eigentliche Code funktioniert dann bei mir: https://eval.in/231911
    Standards - Best Practices - AwesomePHP - Guideline für WebApps

    Kommentar


    • #3
      PHP-Code:
      <?php

      $table 
      = <<<HTML
      <table>
          <thead>
              <tr>
                  <th>head 1</th>
                  <th>head 2</th>
                  <th>head 3</th>
              </tr>
          </thead>
          <tbody>
              <tr>
                  <td>Row 1 Col 1</td>
                  <td>Row 1 Col 2</td>
                  <td>Row 1 Col 3</td>
              </tr>
              <tr>
                  <td>Row 2 Col 1</td>
                  <td>Row 2 Col 2</td>
                  <td>Row 2 Col 3</td>
              </tr>
              <tr>
                  <td>Row 3 Col 1</td>
                  <td>Row 3 Col 2</td>
                  <td>Row 3 Col 3</td>
              </tr>
              <tr>
                  <td>Row 4 Col 1</td>
                  <td>Row 4 Col 2</td>
                  <td>Row 4 Col 3</td>
              </tr>
              <tr>
                  <td>Row 5 Col 1</td>
                  <td>Row 5 Col 2</td>
                  <td>Row 5 Col 3</td>
              </tr>
          </tbody>
      </table>
      HTML;

      $query = <<<XPATH
      *//*[(self::td or self::th) and count(./preceding-sibling::*)+1 != 1]
      XPATH;

      $document = new DOMDocument();
      $xpath = new DOMXPath($document);

      $snippet $document->createDocumentFragment();
      $snippet->appendXML($table);

      foreach ( 
      $xpath->query($query$snippet) as $current ) {
          
      $current->parentNode->removeChild($current);
      }

      echo 
      $document->saveHtml($snippet);
      [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

      Kommentar

      Lädt...
      X