138701
Goto Top

Regex Problem

Hallo zusammen

Ich möchte alle TR-Elemente aus einer Datei einzeln in einen Array packen

So sieht die Datei aus:
<tr>
    <td>...</td>
</tr>
<tr>
    <td>...</td>
</tr>
...

Mein Code:
preg_match_all('#<tr>([\s\S](?!.*<tr>))+<\/tr>#', $context, $match2);  

Das Regex packt alle Elemente in ein einziges Element des Arrays - Was ist falsch?

Content-ID: 594207

Url: https://administrator.de/forum/regex-problem-594207.html

Ausgedruckt am: 22.04.2025 um 01:04 Uhr

LordGurke
LordGurke 06.08.2020 um 19:54:23 Uhr
Goto Top
Welche PHP-Version nutzt du - und vor allem, unter welchem OS? Bei mir funktioniert das unter Linux tadellos:

$input = <<<EOF
<tr>
    <td>Gr1</td>
</tr>
<tr>
    <td>Gr2</td>
</tr>
EOF;

echo "\n\n";  

preg_match_all('#<tr>([\s\S](?!.*<tr>))+<\/tr>#', $input, $match2);  

var_dump($match2);

echo "\n\n";  

Ausgabe:
array(2) {
  =>
  array(2) {
    =>
    string(27) "<tr>  
    <td>Gr1</td>
</tr>"  
    [1]=>
    string(27) "<tr>  
    <td>Gr2</td>
</tr>"  
  }
  [1]=>
  array(2) {
    =>
    string(1) "  
"  
    [1]=>
    string(1) "  
"  
  }
}
145033
145033 07.08.2020 aktualisiert um 11:24:59 Uhr
Goto Top
Regex kann man bei HTML machen ist aber meist sauberer man nimmt bei solchen Dokumenten gleich einen richtigen Parser wie die DOMDocument Klasse:
Bsp.
<?php
// string definieren
$str = '  
<!doctype html>
<html>
<head>
<meta charset="utf-8">  
<title>Testdokument</title>
</head>
<body>
<table width="500" border="1" cellspacing="0" cellpadding="2">  
  <tr>
    <td>Test1</td>
    <td>Test2</td>
    <td>Test3</td>
  </tr>
  <tr>
    <td>Test4</td>
    <td>Test5</td>
    <td>Test6</td>
  </tr>
  <tr>
    <td>Test7</td>
    <td>Test8</td>
    <td>Test9</td>
  </tr>
</table>
</body>
</html>
';  
// DOM Document erstellen
$doc = new DOMDocument();
// HTML laden
$doc->loadHTML($str);
// tr elements extrahieren
$tr_elements = $doc->getElementsByTagName('tr');  
var_dump($tr_elements);
?>
138701
138701 11.08.2020 aktualisiert um 17:43:50 Uhr
Goto Top
Ohne die beiden Zeichen funktionierts.

preg_match_all('#<tr>([\s\S](?! .* <tr>))+<\/tr>#', $context, $match2);