2010-11-18 10 views
0

Stellen Sie einen Code von php erzeugt haben:PHP - Daten "on the fly" zugänglich machen und modifizieren?

<ul> 
    <li><?php smth ?></li> 
    <li><?php smth ?></li> 
    <li><?php smth ?></li> 
</ul> 
<ul> 
    <li><?php smth ?></li> 
    <li><?php smth ?></li> 
    <li><?php smth ?></li> 
</ul> 
(...) 

Aber das ist der Code dynamisch generiert und geladen in einer Funktion und es gibt keinen direkten Zugang zu jedem Knoten (<li> in diesem Fall). Also auf meiner Website sieht es ein bisschen wie ein include:

<?php include("but not the file but code above generated by some engine"); ?> 

Alles klar? Also hier ist der Deal.

Ich möchte diesen Code ändern. Nach dem Laden will ich also jedes <ul> Element in einem <div> mit steigender ID haben. So wird der Endcode wie folgt aussehen:

<div id="1"> 
    <ul> 
    <li><?php smth ?></li> 
    <li><?php smth ?></li> 
    <li><?php smth ?></li> 
    </ul> 
</div> 

<div id="2"> 
    <ul> 
    <li><?php smth ?></li> 
    <li><?php smth ?></li> 
    <li><?php smth ?></li> 
    </ul> 
</div> 

(...) 

Irgendwelche Ideen? Ich habe mein eigenes Konzept basierend auf dem Entfernen der Website-Code nach dem Laden und Hinzufügen <div>s mit for-Schleife, aber ich glaube, es gibt eleganter Weg?

+0

Ich habe um eine ob_xmlfilter hypothesizing, aber ich war Namen genannt. Im Allgemeinen ist es jedoch möglich, die Ausgabe zu erfassen, sie in QueryPath oder phpQuery zu pipettieren und dann innerhalb von PHP (jQuery-like) zu restrukturieren. Der Nachteil ist, dass dies eine messbare Verlangsamung wäre, also sollten Sie einen wirklich guten Anwendungsfall haben. – mario

Antwort

-1

Verwenden Sie Javascript und Jquery.

$(document).ready(function() { 
    var i = 1; 
    $("ul").each(function() { 
     $(this).wrap('<div id="' + i + '" />'); 
     i++; 
    }); 
}); 
+1

Es wird das gesamte Layout für Menschen mit deaktiviertem JS töten. – fomicz

+0

Er schrieb "nach dem Laden". Ich nahm an, dass das bedeutete ... nachdem die Seite Server-Seite verlassen und im Browser gerendert wurde. Dies bedeutet natürlich, dass Sie Javascript verwenden müssen. –

-1

könnten Sie reqular Ausdrücke verwendet, um den Code in Stücke von <ul>, und dann wieder zusammenbauen die Stücke zusammen mit divs um sie zu brechen.

Im Grunde würden Sie die ursprüngliche Zeichenfolge in ein Array brechen und dann durch das Array gehen und die Zeichenfolge neu erstellen. Fügen Sie jedes Mal, wenn Sie einen Schritt ausführen, einfach ein öffnendes div mit einer inkrementierten ID an den Anfang und das Ende div an das Ende an und fügen Sie dann das neue <ul> zu einer letzten Zeichenfolge hinzu, die zurückgegeben werden soll.

1

Zuerst bereinigen Sie Ihre HTML. Sie müssen Ihre ul Tags mit </ul> schließen, neue nicht mit <ul> öffnen. Zweitens dürfen Sie keine id Werte haben, die mit einer Zahl beginnen, zumindest in HTML4.

Außerdem bin ich nicht sicher genau das, was Sie mit

<?php include("but not the file but code above generated by some engine"); ?> 

Ich denke du meinst Sie eine Datei enthält, die die HTML ausgibt. Dies macht die Dinge ein wenig schwierig. Sie müssen die Ausgabepufferung aktivieren. Sie können dann einige DOMDocument Sachen mit dem aufgenommenen Inhalt tun.

<?php 

ob_start(); // turn output buffering on 
include('your_file.php'); // include the contents of your_file -- contents go into the output buffer 
$text = ob_get_clean(); // put the contents of the output buffer into $text 

$dom = new DOMDocument(); // create a DOMDocument to work on 

$f = $dom->createDocumentFragment(); 
$f->appendXML($text); 
$dom->appendChild($f); // these three lines import $text into $dom 

$i = 0; 
while ($dom->childNodes->length > 0) { // loop through the elements from your file 
    $child = $dom->childNodes->item(0); // working with the first remaining element 
    $dom->removeChild($child); // remove them -- we'll reinsert relevant elements later 

    if ($child->nodeType === XML_ELEMENT_NODE) { // forget about non-element nodes (i.e. whitespace) 
     $div[$i] = $dom->createElement('div'); // create a new parent element 
     $div[$i]->appendChild($child); // stick the current ul into it 
     $div[$i]->setAttribute('id', 'd' . (++$i)); // give it an id like d1, d2, etc. 
    } 
} 

foreach ($div as $d) { 
    $dom->appendChild($d); // reinsert each div element into the DOMDocument 
} 

echo $dom->saveHTML(); // echo the processed content 

Natürlich bei weitem die einfachste Lösung ist die mitgelieferte Datei zu ändern ...