Ankündigung

Einklappen
Keine Ankündigung bisher.

RegEx Frage

Einklappen

Neue Werbung 2019

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

  • RegEx Frage

    Hi,

    ich bräuchte mal Hife um mein Regex Pattern anzupassen.

    HTML-Code:
    [...]
    <tr>
    <td>Text Text <span>Text</span> Text <strong>Text</strong></td>
    <td class="text">Text Text <span>Text</span> Text <strong>Text</strong></td>
    <td>Text Text </td>
    </tr>
    [...]
    PHP-Code:
    $html 'siehe oben';
    $pattern '/<td(.*?)<\/td>/si' ;
    $string preg_replace_callback $pattern, function ($match)
    {
       
    $search=array('<''>');
       
    $replace=array('#OPEN#''#CLOSE#');
       return 
    str_replace($search$replace$match[0]);
    }, 
    $html ) ;
    echo(
    $string); 
    Ausgabe:
    HTML-Code:
    <tr>
    #OPEN#td#CLOSE#Text Text #OPEN#span#CLOSE#Text#OPEN#/span#CLOSE# Text #OPEN#strong#CLOSE#Text#OPEN#/strong#CLOSE##OPEN#/td#CLOSE#
    #OPEN#td class="text"#CLOSE#Text Text #OPEN#span#CLOSE#Text#OPEN#/span#CLOSE# Text #OPEN#strong#CLOSE#Text#OPEN#/strong#CLOSE##OPEN#/td#CLOSE#
    #OPEN#td#CLOSE#Text Text #OPEN#/td#CLOSE#
    </tr>
    gewünscht wäre aber:
    HTML-Code:
    <tr>
    <td>Text Text #OPEN#span#CLOSE#Text#OPEN#/span#CLOSE# Text #OPEN#strong#CLOSE#Text#OPEN#/strong#CLOSE#</td>
    <td class="text">Text Text #OPEN#span#CLOSE#Text#OPEN#/span#CLOSE# Text #OPEN#strong#CLOSE#Text#OPEN#/strong#CLOSE#</td>
    <td>Text Text </td>
    </tr>

  • #2
    Regex eignet sich nicht zur Verarbeitung von HTML. Verwende besser einen HTML-Parser wie z.B. DOMDocument dafür.

    Kommentar


    • #3
      Zitat von Yitu Beitrag anzeigen
      ich bräuchte mal Hife um mein Regex Pattern anzupassen.
      Das kannst du mit RegExp nicht sauber abbilden. Wenn überhaupt - in nur einem Durchlauf bezweifle ich gerade, dass das überhaupt geht.
      Dein Beispiel würde natürlich schon gehen, aber du kannst damit nicht jeden denkbaren Fall abbilden. Besser und nicht wesentlich komplizierter wäre es, wenn du DOMDocument dafür verwendest:

      PHP-Code:
      <?php
      $html 
      = <<<HTML
      <tr>
          <td>Text Text <span>Text</span> Text <strong>Text</strong></td>
          <td class="text" data-foo="<td>">Text Text <span>Text</span> Text <strong>Text</strong></td>
          <td>Text Text </td>
      </tr>
      HTML;

      $doc = new DOMDocument();
      $doc->loadHTML($htmlLIBXML_HTML_NOIMPLIED LIBXML_HTML_NODEFDTD LIBXML_NOERROR);
      $xpath = new DOMXPath($doc);
      foreach(
      $xpath->query('//td') as $node) {
          
      $innerHtml '';
          foreach(
      iterator_to_array($node->childNodes) as $childNode) {
              
      $innerHtml .= $node->ownerDocument->saveHTML($childNode);
              
      $node->removeChild($childNode);
          }
          
      $innerHtml strtr($innerHtml, ['<' => '#OPEN#''>' => '#CLOSE#']);
          
      $node->appendChild($doc->createTextNode($innerHtml));
      }

      printf("%s\n"$doc->saveHTML());
      Das iterator_to_array braucht man in diesem Fall, damit die childNodes eager gezogen werden. Sonst funktioniert $node->removeChild nicht richtig.

      Kommentar


      • #4
        Das ist genau was ich brauche, habe es nämlich nicht geschafft an den Inhalt der TD's samt Tags (child nodes) zu kommen.

        mit $td->nodeValue und $td->textContent bekam ich nur den reinen Text, daher mein "Workaround", aber das hat sich ja jetzt erledigt.

        Vielen Dank!

        Kommentar

        Lädt...
        X