Newsgroup: it.comp.www.php
Titolo: dividere in cartelle testo html (lunghetto)

Sera nius, per cartelle intendo 1550 caratteri. Ho del testo in html
supponiamo 4340 caratteri compresi i tag html.
Io vorrei suddividere questo testo in un array dove ogni elemento dell'array
contenga 1550 caratteri, perchè poi queste cartelle mi andranno a formare le
varie pagine di un lungo articolo che mi hanno appunto chiesto di
suddividere in più pagine.
Il problema sta nell'html, ovvero se vado a tagliare a 1550 la prima fetta
di stringa potrei tagliare un tag che poi non funzionerebbe più
correttamente. L'ideale per me sarebbe considerare 1550 car. puliti ovvero
senza contare l'html pur mantenendolo in qualche modo al suo interno.
Ho provato a dirgli di tagliare la stringa nel punto in cui incontra il tag
di fine paragrafo </P> dopo i 1550 car. e a farlo lo fà ma poi si scasina
con le successive parti
Magari c'è un espressione regolare che riesce a fare tutto questo ma non ho
proprio idea di come realizzarla.
Ecco il codice che però qui ho provato con poco testo e che cmq non si
avvicina a quello che voglio ottenere.
<?
$stringa="<p>questo è il paragrafo 1</p><p>questo è il paragrafo
2</p><p>questo invece è il paragrafo 3</p>";
 $num_car_tot = strlen($stringa); // calcolo il numero totale di caratteri
compresi i tag html
 $num_pagine = round($num_car_tot/15); // ricavo il numero di pagine ovvero
di cartelle da ottenere
for ($i=0; $i<$num_pagine; $i++) {
 $dove = strpos($stringa, "</p>", 15*($i)); // individuo la posizione del
tag di fine paragrafo ignorandolo nei primi 1550 in questo caso 15
 $ar_diviso[] = substr($stringa, 15*$i, $dove); // creo la sotto stringa ed
è qui che mi blocco perchè così gia so che non funzia
}
foreach ($ar_diviso as $chiave=>$val) {
 if (!ereg("</p>$", $val)) $ar_diviso[$chiave].="</p>"; // se la cartella
non finisce con un tag </p> ce lo aggiungo
 if (!ereg("^<p>", $val)) $ar_diviso[$chiave]="<p>".$val; // allo stesso
modo se la cartella non inizia con un tag <p> ce lo aggiungo
}
print_r($ar_diviso); // stampo l'array per vedere cosa ho combinato..un
pasticcio purtroppo!
?>
Spero di aver illustrato chiaramente il mio problema affinchè possiate
aiutarmi, grazie cmq in anticipo.
stefano

 appunto chiesto di suddividere in piy pagine.
Definisci dividere (la divisione a cosa serve?).
Il testo HTML potrebbe contenere tag annidati come quelli per la
gestione delle tabelle che non possono essere suddivisi solamente
gestendo i singoli tag, ma raggruppati (es. solo dopo </table> etc.).
-- 
I am what I am, I do what I can
Non trovi qualche cosa? 
http://url.repository.biz/go/1J

 gestendo i singoli tag, ma raggruppati (es. solo dopo </table> etc.).
ecco a questo poi non avevo pensato il che complica ancora di più le cose
:o/
Spero di essere stato più chiaro ora, cmq grazie per la tua attenzione. :o)
ste

 senza contare l'html pur mantenendolo in qualche modo al suo interno.
fai un explode(" ",$var)
fai un ciclo... per ogni parola che non contiene un < o > aggiungi un valore
all'indice
ovviamente tieni conto delle parole che potrebbe essere all'interno dei tag
<>
per esempio <img src="" border>
src="" non contiene i due caratteri ma con alcuni controlli te la cavi
egregiamente
una soluzione al volo... ma potrebbe essere sufficiente
-- 
Josh
www.pixael.com
icq: 59204079

 una soluzione al volo... ma potrebbe essere sufficiente
grazie josh! tenterň anche questa strada.
ste

stefano wrote:

L'approccio dei tag (se non l'ha chiuso lo chiudi tu e lo riscrivi dopo)
mi sembra corretto ma forse potresti implementarlo diversamente.
Io cercherei di intercettare l'apertura senza chiusura, come farebbe un 
parser (o meglio un validatore) XML...
ti ho scritto un esempio, puoi copiarlo ed incollarlo.
E' per un solo elemento, ma puoi facilmente implementarlo in un ciclo
Ciao
Marcello
------------------------------------------------------------------------------
<?php
$testo_da_dividere=<<<TESTO
<p>1.2 What Is MySQL?</p>
<p>MySQL, the most popular Open Source SQL database, is developed, 
distributed and supported by MySQL AB. MySQL AB is a commercial company 
founded by the MySQL developers that builds its business providing 
services around the MySQL database. See section 1.3 What Is MySQL AB?. </p>
<p>The MySQL web site (
http://www.mysql.com/
) provides the latest 
information about MySQL software and MySQL AB. </p>
<p>MySQL is a database management system. <br/>
A database is a structured collection of data. It may be anything from a 
simple shopping list to a picture gallery or the vast amounts of 
information in a corporate network. To add, access, and process data 
stored in a computer database, you need a database management system 
such as MySQL Server. Since computers are very good at handling large 
amounts of data, database management plays a central role in computing, 
as stand-alone utilities, or as parts of other applications.
MySQL is a relational database management system.
A relational database stores data in separate tables rather than putting 
all the data in one big storeroom. This adds speed and flexibility. The 
tables are linked by defined relations making it possible to combine 
data from several tables on request. The SQL part of ``MySQL'' stands 
for ``Structured Query Language''—the most common standardised language 
used to access databases.
MySQL software is Open Source.
Open Source means that it is possible for anyone to use and modify. 
Anybody can download the MySQL software from the Internet and use it 
without paying anything. Anybody so inclined can study the source code 
and change it to fit their needs. The MySQL software uses the GPL (GNU 
General Public License), 
http://www.gnu.org/licenses/
, to define what 
you may and may not do with the software in different situations. If you 
feel uncomfortable with the GPL or need to embed MySQL code into a 
commercial application you can buy a commercially licensed version from 
us. See section 1.4.3 MySQL Licenses.
TESTO;
# Cerchi tutti i p aperti e chiusi---
preg_match_all("'<p[^>]*>|</p[^>]*>'",$testo_da_dividere,$trovati);
#print_r($trovati);
# Se il numero è pari tutto ok, se è dispari devi aggiungerlo tu... 
(vuol dire che non c'è stata ancora la chiusura)
$testo_ok = (count($trovati)%2 == 1) ? $testo_da_dividere ."</p>" : 
$testo_da_dividere;
 
# e poi ripeti per ogni elemento
?>

 Marcello
Ora la provo, in tutti i casi veramente troppo gentile!
Grazie mille! ;o)
ste

stefano wrote:

Ops c'è un errore. $trovati[0], non trovati!
$testo_ok = (count($trovati[0])%2 == 1) ? $testo_da_dividere ."</p>" : 
$testo_da_dividere;