Fissaggio non chiusa tag HTML

Sto lavorando su alcuni blog layout e ho bisogno di creare un abstract di ogni post (diciamo 15 l’ultima) per mostrare in homepage. Ora il contenuto che uso io è già formattato in html i tag tessile biblioteca. Ora, se io uso la funzione substr per ottenere 1 500 caratteri del post, il principale problema che devo affrontare è come chiudere il tag non chiusi.

e.g

<div>.......................</div>
<div>...........
     <p>............</p>
     <p>...........| 500 chars
     </p>
<div>  

Quello che ottengo è di due aperti i tag <p> e <div> , p abituato a creare tanti problemi , ma div solo pasticci con l’intero layout di pagina. Quindi qualsiasi suggerimento su come monitorare il tag di apertura e chiusura manuale o qualcosa del genere?

Spingere i tag di apertura su una pila, e la pop off a quelli che sono chiusi. Prendere in considerazione di sé tag di chiusura. Quando si sono consumate abbastanza caratteri di testo, serialise il restante tag tag di chiusura, l’ultimo prima.
C’è una simile discussione relativi alla manipolazione del DOM con PHP qui.
sì @alex ho pensato che, cercando di implementare itm c’è qualche esempio che posso seguire ?
<p> tag non deve essere chiuso, a meno che in XHTML. Si assume che si sta utilizzando XHTML?
no, non sto usando l’html. e come ho detto <p> bene .. sono auto chiuso , ma il suo tag div causando i principali problemi di layout

OriginaleL’autore satin | 2011-12-14

3 risposte

  1. 16

    Ci sono un sacco di metodi che possono essere utilizzati:

    1. Utilizzare correttamente un parser HTML, come DOMDocument
    2. Utilizzare PHP in Ordine per la riparazione dell’onu-tag chiuso
    3. Alcuni potrebbero pensare HTML Purifier
    bello, php ordine sono stati davvero semplice.
    tidy è grande per una facile, veloce e sporco. Ehm, voglio dire di pulizia. HTML Purifier è una BESTIA e grande per i set di regole complesse.

    OriginaleL’autore ajreal

  2. 10

    Come ajreal detto, DOMDocument è una soluzione.

    Esempio :

    $str = "
    <html>
     <head>
      <title>test</title>
     </head>
     <body>
      <p>error</i>
     </body>
    </html>
    ";
    
    $doc = new DOMDocument();
    @$doc->loadHTML($str);
    echo $doc->saveHTML();

    Vantaggio : incluso in modo nativo in PHP, contrariamente a PHP in Ordine.

    Apprezzo questa è una risposta semplice, se si tratta di un semplice problema, e non si desidera che il sovraccarico di installare qualsiasi librerie extra. Nel mio caso, ho avuto gli utenti incolla HTML incomplete e-mail e la Parola, e questo risolto.
    Che era esattamente il tipo di pulito risposta che stavo cercando. Grazie tanto per questo.

    OriginaleL’autore Jerry

  3. 0

    È possibile utilizzare DOMDocument di farlo, ma attenzione di stringa problemi di codifica. Inoltre, dovrete utilizzare un intero documento HTML, quindi estrarre i componenti che si desidera. Ecco un esempio:

    function make_excerpt ($rawHtml, $length = 500) {
      //append an ellipsis and "More" link
      $content = substr($rawHtml, 0, $length)
        . '&hellip; <a href="/link-to-somewhere">More &gt;</a>';
    
      //Detect the string encoding
      $encoding = mb_detect_encoding($content);
    
      //pass it to the DOMDocument constructor
      $doc = new DOMDocument('', $encoding);
    
      //Must include the content-type/charset meta tag with $encoding
      //Bad HTML will trigger warnings, suppress those
      @$doc->loadHTML('<html><head>'
        . '<meta http-equiv="content-type" content="text/html; charset='
        . $encoding . '"></head><body>' . trim($content) . '</body></html>');
    
      //extract the components we want
      $nodes = $doc->getElementsByTagName('body')->item(0)->childNodes;
      $html = '';
      $len = $nodes->length;
      for ($i = 0; $i < $len; $i++) {
        $html .= $doc->saveHTML($nodes->item($i));
      }
      return $html;
    }
    
    $html = "<p>.......................</p>
      <p>...........
        <p>............</p>
        <p>...........| 500 chars";
    
    //output fixed html
    echo make_excerpt($html, 500);

    Uscite:

    <p>.......................</p>
      <p>...........
        </p>
    <p>............</p>
        <p>...........| 500 chars… <a href="/link-to-somewhere">More &gt;</a></p>

    Se si utilizza WordPress si dovrebbe avvolgere il substr() invocazione in una chiamata a wpautopwpautop(substr(...)). Si potrebbe anche voler testare la lunghezza di $rawHtml passato alla funzione, e saltare aggiungendo il link “altro”, se non è abbastanza lungo.

    OriginaleL’autore Kevin Newman

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *