2013-05-09 16 views
5

Używam preg_match() wyodrębnić fragmenty tekstu ze zmiennej, i powiedzmy zmienna wygląda następująco:preg_match stanowiąc bardzo dziwne

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

middle text 

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

chcę, aby wyodrębnić zawartość „s oraz wejścia nich [htmlcode] do tablicy. Robię to za pomocą preg_match().

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

Powyższe wyjścia kod

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

zamiast

  1. [htmlcode] ten ma być wyświetlony [/ htmlcode]
  2. [htmlcode] Jest to również ma być wyświetlane [/ kod html]

a jeśli już oficjalnie zabrakło pomysłów

+0

Gdzie jest 'preg_replace'? – hjpotter92

+0

Właściwie to wcale nie jest dziwne;) zobacz odpowiedzi. –

+0

@ hjpotter92 dobry punkt, jednak problem tkwi w regex, a nie w funkcji PHP. –

Odpowiedz

4

Jak już wyjaśniono; wzór * jest chciwy. Kolejną rzeczą jest użycie funkcji preg_match_all(). Zwróci Ci wielowymiarową tablicę dopasowanych treści.

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

a dostaniesz to: http://codepad.viper-7.com/z2GuSd

3

* panterka jest chciwy, to będzie jeść wszystko aż ostatniej[/htmlcode]. Spróbuj zastąpić * niezasadnym *?.

2

Spójrz na ten kawałek kodu:

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

Teraz, jeśli wzór działa dobrze i wszystko jest w porządku, należy wiedzieć:

  • return oświadczenie złamie wszystkie pętle i będzie wyjść z funkcjonować.
  • Pierwszym elementem w meczach jest cały mecz, cały ciąg. W twoim przypadku $text

Tak więc, zwróciłeś pierwszy duży ciąg znaków i opuściłeś funkcję.

Proponuję można sprawdzić pożądanych wyników:

$matches[1] i $matches[2]

Powiązane problemy