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-Key: 594207

Url: https://administrator.de/contentid/594207

Printed on: April 18, 2024 at 03:04 o'clock

Member: LordGurke
LordGurke Aug 06, 2020 at 17:54:23 (UTC)
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) "  
"  
  }
}
Mitglied: 145033
145033 Aug 07, 2020 updated at 09:24:59 (UTC)
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);
?>
Mitglied: 138701
138701 Aug 11, 2020 updated at 15:43:50 (UTC)
Goto Top
Ohne die beiden Zeichen funktionierts.

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