php regex zu extrahieren Daten aus HTML-Tabelle
-
18-09-2019 - |
Frage
Ich versuche, einen regulären Ausdruck zu machen für einige Daten aus einer Tabelle unter.
der Code ich habe jetzt ist:
<table>
<tr>
<td>quote1</td>
<td>have you trying it off and on again ?</td>
</tr>
<tr>
<td>quote65</td>
<td>You wouldn't steal a helmet of a policeman</td>
</tr>
</table>
Das habe ich ersetzt werden soll durch:
quote1: haben Sie es aus und wieder versuchen,
quote65: Sie würden keinen Helm eines Polizisten stehlen
der Code, den ich schon geschrieben habe, ist dies:
%<td>((?s).*?)</td>%
Aber jetzt bin ich stecken.
Lösung
Tims Regex wahrscheinlich funktioniert, aber Sie können mit der DOM-Funktionalität von PHP statt regex betrachten wollen, wie es zuverlässiger sein kann im Markup mit geringfügigen Änderungen im Umgang.
Siehe die loadhtml Methode
Andere Tipps
Wenn Sie wirklich wollen, reguläre Ausdrücke zu verwenden (vielleicht in Ordnung sein, wenn Sie wirklich, wirklich sicher, dass die Zeichenfolge sind, werden immer so formatiert werden), was so etwas wie dies in Ihrem Fall:
$str = <<<A
<table>
<tr>
<td>quote1</td>
<td>have you trying it off and on again ?</td>
</tr>
<tr>
<td>quote65</td>
<td>You wouldn't steal a helmet of a policeman</td>
</tr>
</table>
A;
$matches = array();
preg_match_all('#<tr>\s+?<td>(.*?)</td>\s+?<td>(.*?)</td>\s+?</tr>#', $str, $matches);
var_dump($matches);
Ein paar Worte über die regex:
-
<tr>
- dann eine beliebige Anzahl von Leerzeichen
- dann
<td>
- dann, was Sie erfassen möchten
- dann
</td>
- und das gleiche wieder
- und schließlich
</tr>
Und ich benutze:
-
?
in der Regex in nicht-gierigen Modus übereinstimmen
-
preg_match_all
erhalten alle Spiele
Sie erhalten dann die gewünschten Ergebnisse in $matches[1]
und $matches[2]
(nicht $matches[0]
) ; hier ist der Ausgang der var_dump
I verwendet (I entfernen habe Eintrag 0, um es kürzer) :
array
0 =>
...
1 =>
array
0 => string 'quote1' (length=6)
1 => string 'quote65' (length=7)
2 =>
array
0 => string 'have you trying it off and on again ?' (length=37)
1 => string 'You wouldn't steal a helmet of a policeman' (length=42)
Sie brauchen dann nur dieses Array zu manipulieren, mit einigen Strings Verkettung oder dergleichen; zum Beispiel wie folgt aus:
$num = count($matches[1]);
for ($i=0 ; $i<$num ; $i++) {
echo $matches[1][$i] . ':' . $matches[2][$i] . '<br />';
}
Und Sie erhalten:
quote1:have you trying it off and on again ?
quote65:You wouldn't steal a helmet of a policeman
Hinweis: Sie sollten einige Sicherheitschecks Hinzufügen (wie preg_match_all
muss true zurückgeben, müssen Zahl mindestens 1, ... sein)
Als Randbemerkung: regex mit HTML zu analysieren ist in der Regel nicht eine wirklich gute Idee ; Wenn Sie einen echten Parser verwenden können, soll es seinen Weg sicherer ...
Wie üblich, Extrahieren von Text aus HTML und andere nicht-regulären Sprachen sollte mit einem Parser getan werden - Regexes können Probleme hier verursachen. Aber wenn Sie Ihre Daten Struktur sicher sind, könnten Sie verwenden
%<td>((?s).*?)</td>\s*<td>((?s).*?)</td>%
die beiden Teile des Textes zu finden. 1 \. \ 2 wäre dann der Ersatz
Wenn der Text nicht mehr als eine Zeile erstrecken, werden Sie sicherer, die (?s)
Bits fallen ...
Verwenden Sie regex nicht, einen HTML-Parser verwenden. Wie der PHP Einfache HTML-DOM-Parser
Extrahieren Sie jedes Gehalt von <td>
preg_match_all("%\<td((?s).*?)</td>%", $respose, $mathes);
var_dump($mathes);