2012-03-12 13 views
5

Chcę przechwycić tekst w nawiasach kwadratowych w poniższym łańcuchu html. Ale regex, który mam poniżej, nie otrzymuje "image" i imagealt 'oddzielnie, ale zwraca "image" "alt =" [imagealt "zamiast tego. Jeśli wyjmę alt = "[imagealt]" z ciągu znaków, zwróci on tak, jak oczekiwałbym/chciałbym.regex, aby znaleźć ciąg w nawiasach kwadratowych []

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

) 

Odpowiedz

7

Twój regex jest bycie chciwym. musisz powstrzymać się od chciwości, aby robić to, co chcesz. Dowiedz się więcej o chciwości here.

Gdy mecz jest chciwy, zignoruje pierwszą sytuację, która spełnia warunki wyrażenia regularnego i będzie próbować dopasować, dopóki nie pochłonie tak dużej ilości danych wejściowych, jak tylko może.

Zazwyczaj wiąże się to z dodaniem ? ale nie jestem pewien w php, ale można spróbować:

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

użycie

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

Dodatkowy ? oznacza "zakaz chciwy mecz" zatrzyma po ] znajduje

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

^ daszek jest używany dla oznaczenia początek napisu, więc używam # lub | dla ogranicznika, aby uniknąć nieporozumień. Poza tym używam [^\]*] zamiast .*?, ponieważ z pewnością zatrzymam się, gdy dotrze ono do końca ], podczas gdy potrzebujesz leniwego modyfikatora na swoim ., a może nawet modyfikatora m, aby zapewnić przechwytywanie podziałów linii, jeśli twoje atrybuty zdecydują się dołączyć im.

Powiązane problemy