2012-03-12 27 views
5

Voglio catturare il testo tra parentesi quadre nella stringa html sottostante. Ma la regex che ho qui sotto non ottiene 'immagine' e immagina 'separatamente ma restituisce' immagine '"alt =" [imagealt' invece. Se tolgo l'alt = "[imagealt]" dalla stringa, ritorna come mi aspetterei/volessi.regex per trovare la stringa tra parentesi quadre []

$html = '<h2>[title]</h2> 
<div class="content"><img src="[image]" alt="[imagealt]" /></div> 
<div class="content">[text]</div>'; 

preg_match_all("^\[(.*)\]^",$html,$fields, PREG_PATTERN_ORDER); 

echo "<pre>"; 
print_r($fields); 
echo "</pre>"; 


Array 
(
    [0] => Array 
     (
      [0] => [title] 
      [1] => [image]" alt="[imagealt] 
      [2] => [text] 
     ) 

    [1] => Array 
     (
      [0] => title 
      [1] => image]" alt="[imagealt 
      [2] => text 
     ) 

) 

risposta

7

tua regex è essere avidi. devi smetterla di essere avido di fare ciò che vuoi. Scopri un po 'di più sull'avidità here.

Quando una partita è avida, ignorerà la prima situazione che soddisfa la regex e continuerà a cercare di corrispondere fino a quando non consumerà il maggior numero di input possibile.

Di solito questo comporta l'aggiunta di un ? ma non sono certo in PHP, ma si potrebbe provare:

preg_match_all("^\[(.*?)\]^",$html,$fields, PREG_PATTERN_ORDER); 
3

uso

 preg_match_all("^\[(.*?)\]^",$html,$fields, PREG_PATTERN_ORDER); 

L'extra ? significa "non partita greedy" si ferma dopo un ] è trovato

5
preg_match_all("#\[[^\]]*\]#",$html,$fields, PREG_PATTERN_ORDER); 

Il ^ accento circonflesso viene usato per segnare l'inizio della stringa, per cui uso # o | per il delimitatore per evitare confusione. Inoltre, io uso [^\]*] invece di .*? perché è certo di fermarsi quando raggiunge la fine dello ], mentre hai bisogno del modificatore pigro sul tuo . e forse anche del modificatore m per assicurarti di catturare interruzioni di riga se i tuoi attributi decidono di includere loro.

Problemi correlati