RegEx klappt nicht. Zu "gierig"

fanste

Erfahrenes Mitglied
EDIT:
Hat sich erledigt. Mit preg_match_all klappts nun.
hatte beim ersten Versuch mit dieser Funktion noch die ? drin.


Hi,

Ich habe hier folgenden RegEx
Code:
#<!-- BEGIN (.*?) -->(.*)<!-- END (.*?) -->#Uis

Wie bekomme ich es hin, dass er mir aus dieser Datei

HTML:
<table width="100%" class="tablebg" cellspacing="1" cellpadding="3" border="0">
  <tr>
    <th class="rowcol3" align="center" height="25">Foren</th>
    <th class="rowcol3" align="center" height="25">letzter Beitrag</th>
    <th class="rowcol3" align="center" height="25">Antworten</th>
    <th class="rowcol3" align="center" nowrap="nowrap" height="25">Themen</th>
  </tr>
  <!-- BEGIN CATEGORIE -->
  <tr>
    <td class="underhead" width="100%" colspan="4">{CATEGORY_NAME}</td>
  </tr>
  <!-- END CATEGORIE -->
  <!-- BEGIN FORUM -->
  <tr>
    <td width="100%" height="20" class="rowcol1">
       <div style="width:400px;height:100%;margin-left:5px;">
          <span class="textnormal">{FORUM_NAME}</span>
       </div>
    </td>
    <td height="20" class="rowcol2" align="center"><span class="textmittel">{F_LAST_POSTER}</span></td>
    <td height="20" class="rowcol2" align="center"><span class="textmittel">{F_ANSWERS}</span></td>
    <td height="20" class="rowcol2" align="center" nowrap="nowrap"><span class="textmittel">{F_TOPICS}</span></td>
  </tr>
  <!-- END FORUM -->
  
</table>

NUR jeweils die Zeilen zwischen einem BEGIN und END Kommentar ausließt? Momentan bekomme ich bei folgender Anwendung
PHP:
if(preg_match("#<!-- BEGIN (.*?) -->(.*)<!-- END (.*?) -->#Uis",$this->openedTemplate[$tmpFile],$m))
{
     print_r($m);
}

Dieses Array zurück
Code:
Array
(
    [0] => <!-- BEGIN CATEGORIE -->
  <tr>
    <td class="underhead" width="100%" colspan="4">{CATEGORY_NAME}</td>
  </tr>
  <!-- END CATEGORIE -->
  <!-- BEGIN FORUM -->
  <tr>
    <td width="100%" height="20" class="rowcol1">
       <div style="width:400px;height:100%;margin-left:5px;">
          <span class="textnormal">{FORUM_NAME}</span>
       </div>
    </td>
    <td height="20" class="rowcol2" align="center"><span class="textmittel">{F_LAST_POSTER}</span></td>
    <td height="20" class="rowcol2" align="center"><span class="textmittel">{F_ANSWERS}</span></td>
    <td height="20" class="rowcol2" align="center" nowrap="nowrap"><span class="textmittel">{F_TOPICS}</span></td>
  </tr>
  <!-- END FORUM -->
    [1] => CATEGORIE -->
  <tr>
    <td class="underhead" width="100%" colspan="4">{CATEGORY_NAME}</td>
  </tr>
  <!-- END CATEGORIE -->
  <!-- BEGIN FORUM
    [2] => 
  <tr>
    <td width="100%" height="20" class="rowcol1">
       <div style="width:400px;height:100%;margin-left:5px;">
          <span class="textnormal">{FORUM_NAME}</span>
       </div>
    </td>
    <td height="20" class="rowcol2" align="center"><span class="textmittel">{F_LAST_POSTER}</span></td>
    <td height="20" class="rowcol2" align="center"><span class="textmittel">{F_ANSWERS}</span></td>
    <td height="20" class="rowcol2" align="center" nowrap="nowrap"><span class="textmittel">{F_TOPICS}</span></td>
  </tr>
  
    [3] => FORUM
)

Und das ist nicht ganz das, was ich beabsichtige. :-)
Mir ist schon klar, dass ich mit preg_match() ein paar Array Einträge mehr erhalte, als ich brauche, aber bisher hatte ich noch bei keinem Versuch das was ich haben wollte.

Viel Code wenig Text, ich hoffe ihr könnt mir da trozdem helfen. ;)

Danke schonmal im vorraus.

EDIT:
Hab gerade gelesen, dass sich der Modifikatoren U und ein ? im SuchPattern widersprechen. Wenn ich das ? weglasse, findet er mir aber nur das CATEGORIE
 
Zuletzt bearbeitet:
Ein Fragezeichen hinter dem Quantor sorgt für die „Zügelung“ der Gier. In deinem Beispiel hast du es auch schon teilweise angewandt.
 
OK
Nach anfänglichen Schwierigkeiten und einer kleinen Behlerung von Gumbo, habe ich schon das nächste Problem in diesem Zusammenhang.
Folgender Codeausschnitt:
PHP:
$dimensions[0] = $blockNum[$i][$key.(strstr($key,'.')?'':'.')];
/*Variante1*/
$blockcode = preg_replace("#<!-- BEGIN ".$key." -->(.*)<!-- END ".$key." -->#Ueis","\$this->blockReplace('$dimensions', '$1', $fileNum)",$blockcode);
/*Variante2*/
$blockcode = preg_replace("#<!-- BEGIN ".$key." -->(.*)<!-- END ".$key." -->#Ueis","\$this->blockReplace(".$dimensions.", '$1', $fileNum)",$blockcode);
Wenn ich dann jetzt $dimensions in der Funktion blockReplace ausgeben lassen will bekomme ich bei Variante 1 den Sring "Array" und bei Variante 2 einen Fehler (unexpected ',', expecting '(').Ist ja klar, dass dieser Fehler kommt. Da würde ja dann nur Array stehen. PHP denkt dann, dass jetzt eine Array Definition kommt.
So lasse ich es ausgeben. (Variante 1)
PHP:
echo (is_array($dimensions)?print_r($dimensions,true):$dimensions);
is_array() liefert also immer false zurück.

Wie schaffe ich es, dass ich dieses Array übergeben bekomme? Es muss innerhalb der Funktion preg_replace() geschehen.
 
Das ist eine rekursive Funktion, die sich selbst aufruft (klar ^^). Und da muss immer das Array mitübergeben werden, bei dem ich mich gerade befinde.
Diese Funktion ist teil eines TemplateSystems. Diese Funktion soll mir dann so ein Template wie oben (HTML Code), nur das "<!-- END CATEGORIE -->" unter "END FORUM" steht, bearbeiten.

Die Funktion funktioniert ja auch eigentlich, arbeite allerdings bis jetzt mit eval, will aber davon wegkommen.

Wenn es so nicht geht, wie ich es jetzt vorhabe, muss ich halt bei eval bleiben.
 
Zuletzt bearbeitet:
Zurück