UDT Table-of-contents e funzione preg_match_all() [RISOLTO] Topic is solved

La discussione sul CMS Made Simple in italiano.

Moderator: magallo

Post Reply
osvaldo

UDT Table-of-contents e funzione preg_match_all() [RISOLTO]

Post by osvaldo »

Ciao a tutti!

Ho implementato un UDT per ottenere la table-of-contents relativa al contenuto di una pagina modificando leggermente la versione originale dell'UDT presente in http://wiki.cmsmadesimple.org/index.php ... f_contents.

Le modifiche che ho apportato più che altro riguardano l'HTML generato in modo da inserire il tutto in un div e l'aggiunta di id e class per rendere il tutto modificabile facilmente via CSS...

Il tutto funziona piuttosto bene salvo la presenza di un difetto un po' noioso. La TOC la costruisco cercando tutti i tag di tipo Header, come nella versione originale dell'UDT, (il livello lo uso per indentare gli elementi nella TOC) che presentano la proprietà id impostata: il valore di id diventa l'anchor generato.

Il problema è che la regola espressa nella funzione preg_match_all() seleziona gli header che hanno id ma scarta tutti quelli che presentano altre proprietà impostate!!! Ad esempio:


pippo

viene considerata valida, mentre

pippo

viene scartata.

Ho provato a modificare la regola e il codice in modo da riconoscere questa forma, ma non sono molto pratico di PHP e meno ancora delle regole della funzione in questione. Al momento sono riuscito a ottenere il riconoscimento delle forme:

...

ma se id non è il primo e style subito il secondo o se ci sono altre prorpietà non funziona più niente!  :'(


Di seguito c'è il codice dell'UDT che sto usando ora... qualcuno può aiutarmi a trovare una regola che permetta al codice di funzionare e rilevare correttamente tutti i tag header che presentano id="..." in qualsiasi posizione questi si trovino?

Il problema è noioso perché uso FCKeditor e questo quando mi mostra la pagina in WYSIWYG mode altera l'ordine delle prorpietà nei tag! Non pretendo di poter inserire con in modo comodo la proprietà id (anche se sarebbe bello farlo con una dialog dall'editor direttamente senza passare a modificare il codice a mano...  ;) ) ma almeno non dover mettere mano all'HTML ogni volta che si modifica il contenuto di una pagina...  :-[

Grazie a Tutti!

Osvaldo

p.s. Il codice dell'UDT:

function get_table_of_contents($page_contents, $header)
{
    // Generate table of contents
preg_match_all("/(.*)/i", $page_contents, $match);
    if (FALSE == empty($match[0])) {
        $contents  = "\n    ".$header."\n";

        foreach ($match[0] as $key => $value) {
            if (2 == $match[1][$key]) {
                $contents .= '';
            } else {
                $contents .= '        ';
            }
            $contents .= ''.$match[4][$key].'';
            // Start a new sub-list if this item has children otherwise just end the list item
            if (FALSE == empty($match[1][$key + 1]) && $match[1][$key + 1] == $match[1][$key] + 1) {
                $contents .= "\n    \n";
                $unclosed_list = TRUE;
            } else {
                $contents .= "\n";
            }
            // If the next item is higher level then close this list item (I.E. current item is h3 and next is h2
            if (FALSE == empty($match[1][$key + 1]) && $match[1][$key + 1] == $match[1][$key] - 1) {
                $contents .= "    \n\n";
                $unclosed_list = FALSE;
            }
        }
        if (FALSE == empty($unclosed_list)) {
            $contents .= "    \n\n";
        }
        $contents .= "\n";
    } else {
        $contents = '';
    }
    return $contents;
}
echo get_table_of_contents($params['thepagecontent'], $params['header']);
Last edited by osvaldo on Mon Jul 14, 2008 1:02 pm, edited 1 time in total.
alby

Re: UDT Table-of-contents e funzione preg_match_all()

Post by alby »

osvaldo wrote: Il problema è che la regola espressa nella funzione preg_match_all() seleziona gli header che hanno id ma scarta tutti quelli che presentano altre proprietà impostate!!! Ad esempio:
Con questo code mi pare che funzioni  ;)

Code: Select all

<?php
$content = <<<EOT
<p id="dqw">qwq</p><h3 id=eqwr>VALE</h3>
<H2>ANDREA</H2>
<H4 ID="asd">SIMONE</H4>
<div style="sdew">ewewrew</div>
wefw<h1 class="wrew" id="aeqw" styel="ew">ALBY</h1>
eweq
EOT;

preg_match_all("/<h[^>]+>(.*)<\/[^>]+>/i", $content, $arr);

var_export($arr);
?>
Alby
osvaldo

Re: UDT Table-of-contents e funzione preg_match_all()

Post by osvaldo »

Ciao Alby,

probabilmente non mi sono spiegato molto bene... :P nell'array $match è giusto che compaiano tutti e soli i tag che presentano la proprietà id impostata indipendentemente dalla posizione della prorpietà id nell'elenco delle proprietà (l'UDT che ho allegato funziona ma solo se id è il primo dell'elenco!

Ho letto la guida di PHP per capire le espressioni regolari, ma devo essere sincero, non ho capito nemmeno se sia possibile ottenere quello che mi serve... :-\

Ho provato il codice che mi hai indicato, ma mi elenca tutti i tag h... anche quelli che non hanno la proprietà id...

Grazie
osvaldo
Last edited by osvaldo on Mon Jun 23, 2008 9:41 pm, edited 1 time in total.
alby

Re: UDT Table-of-contents e funzione preg_match_all()

Post by alby »

osvaldo wrote: Ho letto la guida di PHP per capire le espressioni regolari, ma devo essere sincero, non ho capito nemmeno se sia possibile ottenere quello che mi serve... :-\

Ho provato il codice che mi hai indicato, ma mi elenca tutti i tag h... anche quelli che non hanno la proprietà id...
Non era chiaro...... e questo  ;)

Code: Select all

preg_match_all("/<h[^>]+ id=[^>]+>(.*)<\/[^>]+>/i", $content, $arr);
Alby
osvaldo

Re: UDT Table-of-contents e funzione preg_match_all()

Post by osvaldo »

Grazie Alby,

le dritte sono state fondamentali!  ;D

Ho capito un po' di più sulle espressioni regolari e con un po' di prove (la funzione var_export() non la conoscevo...) ho trovato la regola che soddisfa le mie esigenze...

preg_match_all("/(.*)]+>/i", $content, $arr);

questa rileva tutti e soli i tag h che presentano la proprietà id in qualsiasi posizione si presenti e ritorna l'array con il testo rilevato, il numero del livello del tag header, il valore impostato per la proprietà id e il testo racchiuso nel tag!

Se può interessare posso ripostare l'UDT definitivo... 8)

Grazie ancora! :D
Ciao

Osvaldo
alby

Re: UDT Table-of-contents e funzione preg_match_all()

Post by alby »

osvaldo wrote: questa rileva tutti e soli i tag h che presentano la proprietà id in qualsiasi posizione si presenti e ritorna l'array con il testo rilevato, il numero del livello del tag header, il valore impostato per la proprietà id e il testo racchiuso nel tag!

Se può interessare posso ripostare l'UDT definitivo... 8)
Yes,
postalo nella sezione Moduli/Plugins

Alby
Post Reply

Return to “Italian - Italiano”