regex php per estrarre dati dalla tabella HTML
-
18-09-2019 - |
Domanda
Sto cercando di creare un'espressione regolare per estrarre alcuni dati da una tabella.
il codice che ho adesso è:
<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>
Questo voglio sostituirlo con:
quote1: lo hai provato e riacceso?
quote65:Non ruberesti l'elmetto di un poliziotto
il codice che ho già scritto è questo:
%<td>((?s).*?)</td>%
Ma ora sono bloccato.
Soluzione
regex di Tim probabilmente funziona, ma si può prendere in considerazione utilizzando la funzionalità DOM di PHP, invece di regex, in quanto può essere più affidabile nel trattare con lievi modifiche nel markup.
Altri suggerimenti
Se vuoi davvero usare le espressioni regolari (potrebbe essere OK se sei davvero sicuro che la tua stringa sarà sempre formattata in quel modo), che ne dici di qualcosa del genere, nel tuo caso:
$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);
Qualche parola sulla regex:
<tr>
- quindi un numero qualsiasi di spazi
- Poi
<td>
- quindi cosa vuoi catturare
- Poi
</td>
- e lo stesso ancora
- e infine,
</tr>
E io uso:
?
nella regex per corrispondere in modalità non avidapreg_match_all
per ottenere tutte le corrispondenze
Quindi ottieni i risultati desiderati $matches[1]
E $matches[2]
(non $matches[0]
) ;ecco l'output di var_dump
ero solito (Ho rimosso la voce 0, per renderla più breve) :
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)
Devi quindi solo manipolare questo array, con qualche concatenazione di stringhe o simili;per esempio, in questo modo:
$num = count($matches[1]);
for ($i=0 ; $i<$num ; $i++) {
echo $matches[1][$i] . ':' . $matches[2][$i] . '<br />';
}
E ottieni:
quote1:have you trying it off and on again ?
quote65:You wouldn't steal a helmet of a policeman
Nota :dovresti aggiungere alcuni controlli di sicurezza (Piace preg_match_all
deve restituire vero, il conteggio deve essere almeno 1, ...)
Come nota a margine: usare regex per analizzare l'HTML non è generalmente una buona idea ;se puoi usare un vero parser, dovrebbe essere molto più sicuro ...
Come al solito, il testo estrazione da HTML e altri linguaggi non regolari dovrebbe essere fatto con un parser - regex possono causare problemi qui. Ma se siete certi della struttura dei vostri dati, è possibile utilizzare
%<td>((?s).*?)</td>\s*<td>((?s).*?)</td>%
per trovare le due parti di testo. \ 1:. \ 2 sarebbe allora la sostituzione
Se il testo non può estendersi più di una riga, si sarebbe più sicuro far cadere i bit (?s)
...
Non utilizzare regex, utilizzare un parser HTML. Come ad esempio la PHP Simple HTML DOM Parser
Estrarre ogni contenuto da <td>
preg_match_all("%\<td((?s).*?)</td>%", $respose, $mathes);
var_dump($mathes);