2013-05-09 15 views
5

ich preg_match() bin mit Stücken von Text aus einer Variablen zu extrahieren, und lassen Sie uns sagen, dass die Variable wie folgt aussieht:preg_match wirkt sehr seltsam

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

middle text 

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

i den Inhalt der [htmlcode] ‚s und sie extrahieren in ein Array. Ich mache das mit preg_match().

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

Die obigen Codeausgänge

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

statt

  1. [Htmlcode] Dies soll angezeigt werden [/ Htmlcode]
  2. [Htmlcode] Das gilt auch für angeblich angezeigt werden [/ htmlcode]

und wenn offically die Ideen ausgehen haben

+0

Wo ist 'preg_replace'? – hjpotter92

+0

Eigentlich ist das überhaupt nicht komisch;) siehe die Antworten. –

+0

@ hjpotter92 guter Punkt, aber das Problem ist in der Regex, anstatt der PHP-Funktion verwendet. –

Antwort

4

Wie bereits erläutert; Das * Muster ist gierig. Eine andere Sache ist, preg_match_all() Funktion zu verwenden. Es gibt Ihnen ein mehrdimensionales Array mit passenden Inhalten zurück.

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

Und Sie werden diese: http://codepad.viper-7.com/z2GuSd

3

A * Grouper ist gierig, das heißt es wird alles bis letzte[/htmlcode] essen. Versuchen Sie, * durch nicht-gierige *? zu ersetzen.

2

Blick auf dieses Stück Code:

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

Nun, wenn Ihr Muster funktioniert gut und alles ist in Ordnung, sollten Sie wissen:

  • return Anweisung werden alle Schleifen brechen und beendet die Funktion.
  • Das erste Element in Übereinstimmungen ist die ganze Übereinstimmung, die ganze Zeichenfolge. In Ihrem Fall $text

Also, was Sie getan haben, ist die erste große Zeichenfolge zurückgegeben und verließ die Funktion.

Ich schlage vor, Sie für die gewünschten Ergebnisse überprüfen können:

$matches[1] und $matches[2]