2012-03-12 33 views
5

Quiero capturar el texto entre corchetes en la cadena html a continuación. Pero la expresión regular que tengo a continuación no obtiene 'imagen' y imagealt 'por separado pero devuelve' imagen] "alt =" [imagealt 'en su lugar. Si saco el alt = "[imagealt]" de la cadena, regresa como lo esperaría/querría.regex para buscar una cadena entre corchetes []

$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 
     ) 

) 

Respuesta

7

su expresión regular es ser codicioso. tienes que dejar de ser codicioso para hacer lo que quieras. Descubra un poco más sobre la codicia here.

Cuando una coincidencia es ambiciosa, ignorará la primera situación que satisfaga la expresión regular y seguirá intentando igualar hasta que consuma la mayor cantidad posible de la entrada.

lo general, esto implica la adición de un ? pero no estoy seguro en php, pero usted podría intentar:

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

uso

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

El extra de ? significa "no coincidencia codiciosos" se detendrá después de un ] se encuentra

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

El símbolo de intercalación ^ se utiliza para marcar el inicio de la cadena, así que uso # o | para el delimitador para evitar confusiones. Además, uso [^\]*] en lugar de .*? porque es seguro detenerse una vez que llega al final de ], mientras que necesita el modificador perezoso en su . y tal vez incluso el modificador m para asegurarse de que captura los saltos de línea si sus atributos deciden incluir ellos.

Cuestiones relacionadas