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.

È stato utile?

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.

il metodo loadHTML

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 avida
  • preg_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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top