2013-05-09 13 views
5

Sto usando preg_match() per estrarre porzioni di testo da una variabile, e diciamo la variabile è simile al seguente:preg_match agire molto strano

[htmlcode]This is supposed to be displayed[/htmlcode] 

middle text 

[htmlcode]This is also supposed to be displayed[/htmlcode] 

voglio per estrarre il contenuto dei 's [htmlcode] e loro ingresso in un array. Sto facendo questo usando preg_match().

preg_match('/\[htmlcode\]([^\"]*)\[\/htmlcode\]/ms', $text, $matches); 
foreach($matches as $value){ 
return $value . "<br />"; 
} 

Le uscite di codice di cui sopra

[htmlcode]This is supposed to be displayed[/htmlcode]middle text[htmlcode]This is also supposed to be displayed[/htmlcode] 

anziché

  1. [htmlCode] Questo dovrebbe essere visualizzato [/ htmlCode]
  2. [htmlCode] Questo è anche dovuto essere visualizzato [/ htmlcode]

e se hanno ufficialmente a corto di idee

+0

Dov'è 'preg_replace'? – hjpotter92

+0

In realtà, questo non è affatto strano;) vedere le risposte. –

+0

@ hjpotter92 buon punto, tuttavia il problema è nella regex, piuttosto che la funzione PHP utilizzata. –

risposta

4

Come spiegato già; il modello * è goloso. Un'altra cosa è usare la funzione preg_match_all(). Ti restituirà una matrice multidimensionale di contenuti corrispondenti.

preg_match_all('#\[htmlcode\]([^\"]*?)\[/htmlcode\]#ms', $text, $matches); 
foreach($matches[1] as $value) { 

E avrai questo: http://codepad.viper-7.com/z2GuSd

3

Un * cernia è avido, vale a dire si mangia tutto fino all'ultimo [/htmlcode]. Prova a sostituire * con il non avido *?.

2

Guardate questo pezzo di codice:

preg_match('/\[htmlcode\]([^\"]*)\[\/htmlcode\]/ms', $text, $matches); 
foreach($matches as $value){ 
return $value . "<br />"; 
} 

Ora, se il vostro modello funziona bene e tutto è ok, si dovrebbe sapere:

  • return dichiarazione si romperà tutti i loop e uscirà dalla funzione.
  • Il primo elemento nelle corrispondenze è l'intera corrispondenza, l'intera stringa. Nel tuo caso $text

Quindi, ciò che hai fatto è stato restituito la prima grande stringa ed è uscita dalla funzione.

suggerisco è possibile verificare la presenza di risultati desiderati:

$matches[1] e $matches[2]