[REGEX] preg_replace Rekursion vermeiden

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [REGEX] preg_replace Rekursion vermeiden

    Hi Leute,

    kurz vorweg: es geht nicht um verschachtelte BB-Codes.

    Und zwar habe ich eine Templateklasse gebaut, die Templates aus der Datenbank holt und Ersetzungen durchführt.

    Dann habe ich ein ACP mit einem Modul, um diese Templates zu editieren.
    Dieses Modul greift aber auch auf ein Template zu.
    Das Problem: Der "content" aus der Datenbank, der ungeparsed in das Template soll, wird auch (teilweise zumindest) geparsed und zwar dadurch, dass preg_replace ja das Template mit Inhalt ersetzt, mehr oder weniger.

    PHP-Code:
    {formstart}
    <
    table border="0">
      <
    tr>
        <
    td></td>
        <
    td colspan="3">{ID}</td>
      </
    tr>
      <
    tr>
        <
    td><cms:language name="acp.template.description" /></td>
        <
    td colspan="3">{description}</td>
      </
    tr>
      <
    tr>
        <
    td><cms:language name="acp.template.content" /></td>
        <
    td colspan="3">{content}</td>
      </
    tr>
      <
    tr>
        <
    td><cms:language name="acp.template.content_type" /></td>
        <
    td><cms:language name="active" /></td>
        <
    td><cms:language name="acp.template.php_allowed" /></td>
        <
    td><cms:language name="acp.template.style" /></td>
      </
    tr>
      <
    tr>
        <
    td>{content_type}</td>
        <
    td>{active}</td>
        <
    td>{php_allowed}</td>
        <
    td>{fk_style}</td>
      </
    tr>
    </
    table>
    {
    formend
    Wird mir dann im ACP angezeigt als (im textarea):
    PHP-Code:
    <form name="templateEdit" ID="templateEdit" action="(entfernt)" method="post" onSubmit="(entfernt)">
    <
    table border="0">
      <
    tr>
        <
    td></td>
        <
    td colspan="3">{ID}</td>
      </
    tr>
      <
    tr>
        <
    td><cms:language name="acp.template.description" /></td>
        <
    td colspan="3">{description}</td>
      </
    tr>
      <
    tr>
        <
    td><cms:language name="acp.template.content" /></td>
        <
    td colspan="3">{content}</td>
      </
    tr>
      <
    tr>
        <
    td><cms:language name="acp.template.content_type" /></td>
        <
    td><cms:language name="active" /></td>
        <
    td><cms:language name="acp.template.php_allowed" /></td>
       <
    td></td>
      </
    tr>
      <
    tr>
        <
    td><input type="text" value="text/html" name="content_type" /></td>
        <
    td>
          <
    select name="active">
            <
    option selected="selected" value="1">Ja</option>
            <
    option value="0">Nein</option>
          </
    select>
        </
    td>
        <
    td>
          <
    select name="active">
            <
    option selected="selected" value="1">Ja</option>
            <
    option value="0">Nein</option>
          </
    select>
        </
    td>
      </
    tr>
    </
    table>
    </
    form
    Der Code:
    PHP-Code:
      function getTemplate($name$styleID 1$data = array()){
        
    $template $this->getRawTemplate($name$styleID);
        
    $data array_merge($data$this->globalData);
        foreach (
    $data as $key => $value){
          
    $template preg_replace("!(\{".$key."\})!imsU"$value$template);
        }
        
    $template $this->parseCode($template$name$styleID);
        return 
    $template;
      } 
    $data ist das array, dass die zu ersetzenden Sachen enthält, bsp.
    Code:
    array('content' => [datenbankfeld content])
    Hat irgend jemand 'ne Idee, wie ich das umgehen kann?
    Zuletzt geändert von DarkRoot; 27.03.2007, 14:31.

  • #2
    Ich habs jetzt gelöst, es ist ein wenig dirty, aber es erfüllt seinen Zweck.
    PHP-Code:
      function getTemplate($name$styleID 1$data = array()){
        
    $template $this->getRawTemplate($name$styleID);
        
    $data array_merge($data$this->globalData);
            
    $data2['content'] = $data['content'];
            unset (
    $data['content']);
        foreach (
    $data as $key => $value){
          
    $template preg_replace("!(\{".$key."\})!imsU"$value$template);
        }
        foreach (
    $data2 as $key => $value){
          
    $template preg_replace("!(\{".$key."\})!imsU"$value$template);
        }
        
    $template $this->parseCode($template$name$styleID);
        return 
    $template;
      } 
    Der Content Platzhalter wird erst zum Schluss ersetzt, somit kann er nicht mehr durch andere ersetzt werden.

    Kommentar

    Lädt...
    X