2012-01-22 17 views
23

Come posso abbinare soggetto tramite PHP preg_match modello di espressione regolare in questo codice HTML:pattern matching più righe tramite PHP preg_match

 <table border=0> 
    <tr> 
    <td> 


    <h2>subject</h2> 



    </td> 

Tutti gli spazi bianchi e ritorni a capo sono lasciati di proposito. Quindi il problema è nell'estrarre il nome del soggetto usando qualche modello di linea multipla?

risposta

2

Molto semplicemente con

preg_match('/<h2>(.*?)<\\/h2>/', $str, $matches); 
print($matches[1]); 

Il formato multi-linea ha alcun effetto sul regex a meno che non è necessario abbinare una stringa che si estende su più righe.

+0

dispiace avrei dovuto essere più specifico. Il problema è nella mancanza di "identificatori" nel codice HTML con cui ho a che fare. Possono esserci altri tag h2 e altri. Quindi sto cercando di utilizzare i tag circostanti per indirizzare esattamente questo particolare punto nel codice. Quindi, come posso far sì che i pattern di espressioni regolari comprendano le multiline? ... –

45

Se siete alla ricerca di (ad esempio) un tag annidati h2all'interno di un tagtd dove c'è solo spazi bianchi tra i due, basta usare \s che comprende spazi, a capo, ecc esempio ::

preg_match('#<td>\s*<h2>(.*?)</h2>\s*</td>#i',$str,$matches); 
// result is in $matches[1] 

Guardalo in azione here.

Per il vostro interesse, here è un elenco di diversi modificatori che è possibile passare alle funzioni preg_*. Bandiere che potrebbero interessarti sono:

  • s ("dotall"): questo rende . partita ogni personaggio, tra cui capo. Quindi, dì che il tuo <h2>.....</h2> è stato distribuito su più righe. Allora dovreste fare

    preg_match('#<td>\s*<h2>(.*?)</h2>\s*</td>#is',$str,$matches); 
    

    in modo da avere le .* andare su più righe (vedi l'extra s alla fine della regex?).

  • m ("multilinea"): questo uno appena lascia ^ e $ partita di inizio/fine della linea anziché solo l'inizio/fine della stringa di . Ne hai davvero bisogno solo se stai usando ^ e $ nel tuo pattern e vuoi che corrispondano all'inizio/fine di ogni singola riga nel tuo input.
+1

Man ... Sono rimasto bloccato per un'ora e mezza finché non ho trovato il tuo post. Grazie! L'attributo "s" è quello che stavo cercando. – codemonkey613

+0

Stavo cercando di far coincidere l'inizio di una particolare linea nell'input multi-linea, quindi ''/^start/im'' –

10

È possibile aggiungere l'operatore m per l'espressione regolare:

// Given your HTML content. 
$html = 'Your HTML content'; 
preg_match('/<td[^>]*>(.*?)<\/td>/im', $html, $matches); 

Spero che questo (ancora) aiuta, hahaha.

+3

Penso che il modificatore' s' (per la modalità "DOTALL" o "single-line") sia a cosa stai pensando, e questo è già stato [suggerito] (http://stackoverflow.com/a/8959000/20938). –

+0

Questo hahaha è molto inquietante. – Ch3shire

-2

È necessario rimuovere tutte le interruzioni di riga utilizzando \s nell'espressione regolare.

$str ="<ol> 
     <li>Capable for unlimited product</li> 
     <li>Two currency support</li> 
     <li>Works with touch screens and click screen based systems</li> 
     <li>Responsive design <b>shopping cart</b>, Specially design for Mac, iPhone, iPad, PC and Android</li> 
     <li>VAT for countries that support a Value Added Tax</li> 
     <li>Barcode scanner checkout option for POS</li> 
     <li>mRSS</li> 
     </ol>"; 

preg_match("/^([A-Za-z0-9\s\<\>\.\,\/\-\ ]+)$/",$str); 

//Sanitize your code before save to database. 

function test_input($data) { 
$data = trim($data); 
$data = htmlspecialchars($data); 
$data = json_encode($data); 
$data = addslashes($data); 
return $data; 
} 

echo test_input($str); 
+0

Penso che voglia conservare le nuove linee –

0

Si consiglia di non usare espressioni regolari per analizzare HTML. Può causare molti problemi se non puoi controllare quale input può essere inserito dall'utente. Esistono molte migliori soluzioni in ogni lingua. Il parser XML nella maggior parte dei casi sta facendo un lavoro migliore.check out DOMDocument, simplehtmldom o php-html-parser

Vedi qui per maggiori risposte perché non si dovrebbe usare espressioni regolari in html: RegEx match open tags except XHTML self-contained tags

+0

stavo cercando questa risposta. Sono rimasto sorpreso dal fatto che 5 anni dopo nessuno ha suggerito che forse è una cattiva idea analizzare l'html con regex. Non capisco perché è downvoted. – s3v3n

+0

Sì, benvenuto nel club. Resto ancora nella mia risposta, però :) –

+0

Questo è sicuramente il modo di avvicinarsi a questo. Dare un altro upvote almeno :-) – Marty