Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2001
    residenza
    Napoli, Italia
    Messaggi
    1,074

    tagliare un testo a blocchi

    Sto cercando di ottenere, da un testo di partenza, una suddivisione in blocchi di testo più piccoli, separati da una riga vuota e preceduti da una sorta di brevissimo abstract.
    Ma procediamo con ordine.
    Per cercare di ottenere la separazione in blocchi, procedo così (codice ripreso dal forum):
    Codice PHP:
    $frase $_POST["txt"];

    $numero_di_caratteri 500;

    preg_match_all("/(\.\s)+/",$frase,$out,PREG_OFFSET_CAPTURE);

    $minima_distanza strlen($frase);
    $offset_minima_distanza false;

    foreach (
    $out[0] as $offset)
    {
        
    $distanza abs($numero_di_caratteri $offset[1]);
        if(
    $distanza $minima_distanza)
        {
            
    $minima_distanza $distanza;
            
    $offset_minima_distanza $offset[1];
        }
    }

    if(
    $offset_minima_distanza)
    $mytesto substr($frase0$offset_minima_distanza 1);
    else
    $mytesto $frase
    ma mi viene restituito questo doppio errore:
    Warning: Wrong value for parameter 4 in call to preg_match_all() in /var/www/vhosts/metatad.it/httpdocs/testconta.php on line 10
    e
    Warning: Invalid argument supplied for foreach() in /var/www/vhosts/metatad.it/httpdocs/testconta.php on line 15
    Dov'è che sbaglio?
    metatad
    graphic & web design

  2. #2
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    guardando questa funzione la sbatterai ancora più forte

    wordwrap();

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2001
    residenza
    Napoli, Italia
    Messaggi
    1,074
    Copiata pari pari dal forum, dopo una ricerca con le parole chiave conta caratteri ...
    tra l'altro, si diceva che questa funzione non avrebbe tagliato l'ultima parola, cosa assai utile...
    cmq, proverò con wordwrap().
    Ma - giusto per sapere/capire, che non guasta mai - qual'era l'errore?
    metatad
    graphic & web design

  4. #4
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    devo essere sincero, non ho guardato il tuo codice, ma l'errore dice che passi come 4 argomento un valore errato.
    Potrebbe essere quello, oppure un errore di apici che causa il conteggio errato degli argomenti passati.

    ciao

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2001
    residenza
    Napoli, Italia
    Messaggi
    1,074
    ... comunque, il wordwrap() funziona, però -appunto - mi tronca le frasi...
    A me servirebbe poter arrivare sino al primo punto successivo al conteggio...
    Cioè, se il testo - ad es. - è:
    "Questa è la frase finale del primo blocco. E qui comincia la frase iniziale del secondo"
    io vorrei una cosa del genere:
    Questa è la frase finale del primo blocco.

    E qui comincia la frase iniziale del secondo
    e non, ad es., così:
    Questa è la frase finale del primo

    blocco. E qui comincia la frase iniziale del secondo
    Chiaro?
    metatad
    graphic & web design

  6. #6
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    urca, non avevo capito...

    Se non sbaglio però puoi dire a wordwrap di usare il . come separatore, però poi ti incasini con i ... forse la via delle regex in effetti è la migliore..

    ciao

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2001
    residenza
    Napoli, Italia
    Messaggi
    1,074
    dal manuale, non mi sembra che a wordwrap possa essere passato un valore-separatore...
    quanto all'uso di regex... come faccio a trovare solo il primo punto successivo all'ultima parola?...
    metatad
    graphic & web design

  8. #8
    Prova ad usare questa:

    codice:
    $len = 30;
    preg_match_all("/.{{$len},}?[?!.]+/s",$testo,$mth);
    print_r($mth[0]);
    Dovrebbe avere il solo inconveniente che se hai delle abbreviazioni o degli acronimi non li riconosce.
    In alternativa ho provato ad aggiungere dei controlli

    codice:
    $len = 30;
    $skipwords='es|avv|dott'; 
    preg_match_all("/.{{$len},}?(?:[?!]|(?<!$skipwords|\b\w)\.)+/si",$testo,$mth);
    print_r($mth[0]);
    Ma che alla fine ovviamente ha i suoi limiti in quanto una frase può chiudersi con una abbreviazione "etc." invece di "etc.." oppure "c.i.a." invece di "c.i.a.." che non vengono riconosciuti come fine di una frase.
    dA .. foto di viaggio
    L'esperienza è il tipo di insegnante più difficile.
    Prima ti fa l'esame, e poi ti spiega la lezione.

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2001
    residenza
    Napoli, Italia
    Messaggi
    1,074
    Thanks, ma non funziona...
    se lo uso insieme a wordwrap(), quello che viene fuori è qualcosa del genere:
    Array ( [0] => Lorem ipsum dolor sit amet, (...) volutpat. Aliquam erat volutpat. Aenean sit
    sul primo blocco, e sul secondo:
    amet metus nec lacus vestibulum rhoncus. [1] => Ut felis neque, placerat...
    Oltretutto, come vedi, non fa assolutamente nulla rispetto alla questione cruciale, cioè dividere solo dopo il punto.
    Se, invece, lo uso da solo, mi dà un unico blocco di testo, che inizia:
    Array ( [0] => Lorem...
    ed ad un certo punto, all'interno dello stesso blocco, scrive:
    vestibulum rhoncus. [1] => Ut felis neque
    Insomma - magari sono ciuoto io... - non mi separa i blocchi (ho provato ad aggiungere un doppio
    così:
    $mth = $mth . "

    ";
    ma non funzia), e mi scrive sempre il numero dell'array... Se al posto di
    Codice PHP:
    print_r($mth[0]); 
    uso
    Codice PHP:
    echo 
    mi scrive solo
    Array
    ...
    metatad
    graphic & web design

  10. #10
    $mth[0] è l'array che contiene tutti i tuoi blocchi. Se print_r() lo metti tra i tag <pre></pre> ti mantiene la formattazione del testo.
    Per dargli una formattazione con HTML basta che fai una cosa simile:

    Codice PHP:
    foreach($mth[0] AS $blocco)
    echo 
    '<div style="width:300px;text-align:justify;padding:10px">'$blocco .'</div>'
    dA .. foto di viaggio
    L'esperienza è il tipo di insegnante più difficile.
    Prima ti fa l'esame, e poi ti spiega la lezione.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.