2012-03-12 24 views
5

Aşağıdaki html dizesindeki köşeli parantez içindeki metni yakalamak istiyorum. Ama aşağıda sahip olduğum normal ifade “görüntü” a sahip değil ve “ayrı ayrı” imgesini görüyor ”görüntü]” alt = ”yerine [imgelemek”. Eğer dizeden alt = "[imagealt]" çıkarsam, beklediğim/istediğim gibi geri döner.regex []

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

) 

cevap

7

senin regex açgözlü ediliyor bulunduktan sonra duracaktır. İstediğin şeyi yapmak için açgözlü olmayı bırakmalısın. Açgözlülük here hakkında biraz daha fazla bilgi edinin.

Bir maç açgözlü olduğunda, normal ifadeyi karşılayan ilk durumu göz ardı eder ve girdiyi olabildiğince fazla tüketene kadar eşleştirmeye çalışmaya devam eder.

Genellikle bu bir ? ekleyerek içerir ama ben php emin değilim, ama deneyebilirsiniz: dize başlangıcını işaretlemek için

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

kullanım

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

ekstra ? anlamına gelen "olmayan açgözlü maç" bir ]

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

^ şapka kullanılır, bu yüzden kullanmak Karışıklığı önlemek için ayırıcı için # veya |. Ayrıca, ]'un sonuna ulaştıktan sonra durması kesin olduğundan .*? yerine [^\]*] kullanıyorum, ancak . öğesinde tembel değiştiriciye ve hatta m değiştiricisine gereksinimleriniz eklendiğinde satır sonlarını yakaladığından emin olmanız gerekir onlar.