Newsgroup: it.comp.www.php
Titolo: punteggiatura

Il testo è contenuto nella stringa come segue:
$Testo = "Da "Le Veglie di Neri" di R. Fucini ...Il babbo, un ometto sulla 
cinquantina, basso, già curvo, con le gambe a roncolo, stava avanti alla 
piccola brigata, strascicandosi dietro faticosamente i suoi gravi zoccoli 
con le suola di legno alta tre dita;";
Devo mettere a video il testo con echo $Testo;
Il problema è che con il punto la frase dovrebbe andare a capo, ma usando la 
funzione str_replace(".",".<br />", $Testo) mi vanno a capo anche il punto 
di R. Fucini e 3 volte in ...Il babbo e questo per ogni punto "."
Esiste una espressione regolare che permetta di fare quello che cerco di 
fare?
In caso contrario come è meglio procedere?
Grazie
Leo

 ha scritto nel messaggio 
news:gGVwl.198767$Ca.3...@twister2.libero.it...

E molto più semplice e immediato dividere la stringa in più parti e 
concatenarle, esempio:
$Testo.="Da "Le Veglie di Neri" di R. Fucini... <br /> \n";
$Testo.="Il babbo, un ometto sulla cinquantina, basso, già curvo, con le 
gambe a roncolo, stava avanti alla piccola brigata, strascicandosi dietro 
faticosamente i suoi gravi zoccoli con le suola di legno alta tre dita; <br 
/> \n";
Cooper.
 

 ha scritto nel messaggio 
news:MeXwl.434$mj5...@tornado.fastwebnet.it...

La stringa $Testo vene estratta da un campo di database, e va elaborata.
Non capisco come sia possibile con il metodo che mi consigli.
Leo

 Non capisco come sia possibile con il metodo che mi consigli.
Non puoi chiedere miracoli, sui puntini sospensivi chiaramente puoi 
agire ma la differenza tra punto fermo e punto di abbreviazione non la 
puoi cogliere con una regexp.
Detto questo è "sano" in *HTML andare a capo con <br /> piuttosto che 
con <p> ?


Ci ho pensato un po', credo di poter fare qualcosa cosě:
sostituire  ... con ||| (o altro carattere inusuale)
poi .. con ||
poi " L." (spazio lettera punto) con " L|" (puň servire ad esempio per le 
abbreviazioni dei cognomi)
poi trasformare tutti i . in <br>
poi trasformare tutti i | in .
che ne pensi?
Troppo oneroso in termini di risorse o un errore di logica che non vedo?
Grazie
Leo

 Troppo oneroso in termini di risorse o un errore di logica che non vedo?
Prova a sostituire
\1<br \/>
a
([^A-Z].[^.])

"Andrea D'Amore" <and.d...@VIALOSPAM.gmail.com.invalid> ha scritto nel 
messaggio news:and.damore-FBCF3...@newssrv.fastweb.it...

Non capisco, per me è (per adesso) troppo elaborato, puoi farmi un esempio 
più esteso?
Grazie
Leo
 







Scusa, ma tu non hai appena detto che vuoi sostituire i TRE PUNTINI di
sospensione? E poi pero' sostituisci il PUNTO SINGOLO.
	$Testo = str_replace('...', '...<br />');
Oppure vuoi sostituire il punto singolo *E* i puntini? In questo caso,
o usi tre str_replace:
	... 			-> 'PUNT1N1_D1_SOSPENS10NE',
	.   			-> '.<br />',
	'PUNT1N1_D1_SOSPENS10NE'-> '...<br />',
o una regexp del tipo
	'/\.([^\.])/' => '.<br />\1'
Non saprei se possa fare altrettanto bene
	/\.{1,3}/	=> '&<br />'
o
	/(\.{1,3})/	=> '\1<br />'
ma vale la pena provare.
*Sospetto* che per testi lunghi i tre str_replace siano piu' veloci.
Leonardo che non ha fatto prove; caveat emptor
-- 
Linten addie toorin addie,
Linten addie toorin ee,
Linten lowrin lowrin lowrin,
The barnyards of Delgaty


Il problema si pone in questi termini:
Prelevo del testo da un campo DB e lo devo formattare mandano a capo il rigo 
quando trovo il punto .
Il problema sorge dal fatto che il . viene usato anche per le abbreviazioni 
o per il proseguo di una frase del tipo  tutti sapevano che.....
(Questo tralasciando i numeri che)
E' praticamente impossibile enumerare tutte le  combinazioni del tipo Avv. 
Dot. Dot.sa. nonché tutt ele abbreviazioni di nomi di persona A. B. 
eccetera.
Come fare per ridurre al minimo le frasi che continuano dopo il punto (cioč 
non individuate da PHP) e soprattutto non mandare mai a capo una frase ad 
un'abbreviazione?
Saluti
Leo


Sono novizio di PHP, ho portato avanti il discorso così
function DaPuntoAInterruzioneLinea($stringa)
{
for ($x=65;$x<91;$x++)
{$L = chr($x);
//echo $L;
$stringa = str_replace(" " .chr($x) ."."," " .chr($x) ."^",$stringa);
}
echo "<br>" .$stringa ."<br>";
$stringa = str_replace("..","^^", $stringa);
echo "<br>" .$stringa ."<br>";
$stringa = str_replace("...","^^^",$stringa);
echo "<br>" .$stringa ."<br>";
////////////
$Abbreviazioni = array (" Avv"," Dott"," Dott.ssa", " Ing", " Arch");
foreach ($Abbreviazioni as $P)
{
$stringa = str_replace($P .".",$P ."^",$stringa);
}
echo "<br>" .$stringa ."<br>";
/////////////
$stringa = str_replace(".","<br />",$stringa);// mette a capo
echo "<br>" .$stringa ."<br>";
$stringa = str_replace("^",".",$stringa);// rimette i punti non fine frase
echo "<br>" .$stringa ."<br>";
}
// prova funzione
$stringa = "Un Avv., Dott., Dott.ssa, Ing., Arch. e scrittori. A. B. 
C.. -Come il diavolo alla festa .. cantavano.";
echo DaPuntoAInterruzioneLinea($stringa)
Funziona, ma di sicuro si può far di meglio, ho prelevato le abbreviazioni 
qui.
http://www.chass.utoronto.ca/~ngargano/corsi/corrisp/abbreviazioni.html
accetto volentieri altre souluzioni che mi velocizziono lo script.
Grazie comunque delle risposte.
leo

un'abbreviazione?
Prova
	'/([aeiouאטלעשי\.])\.([^\.])/' => '\1.<br />\2'
Se scrivi "Dr.ssa. Bruni", ti va a capo solo prima di Bruni, ed e' giusto.
Leonardo SE&O



Esatto, senza considerare anche un dettaglio: che non tutte le frasi che 
hanno un punto necessariamente debbano andare a capo.
Nella lingua italiana il "punto e a capo" si usa in un contesto ben preciso 
e si differenzia dal "punto e continua".
Inoltre non è un problema di punto singolo o doppio, in alcuni contesti 
possono esserci anche più punti per esempio una decina di fila...
Diciamo che è più semplice agire alla fonte, ovvero salvando anche i ritorni 
a capo nel database.
Si presume infatti che i testi siano scritti all'interno di una textarea, e 
su questa è possibile tenere traccia dei ritorni a capo e salvarli sul db.
In questo modo, quando si tratta di dover leggere il testo, esso compare 
esattamente come lo ha inserito l'utente nella textarea.
Ragionare sulle espressioni regolari secondo me è una perdita di tempo, non 
solo per il motivo da te accennato ma perché qui si va in un ambiente 
esclusivamente umano dove la macchina non può intervenire in modo rigoroso.
Cooper.
 


Come fai a dire che ט giusto?   Bruni fa parte di Dr.ssa. non puע andare a 
capo.
Cooper.
 


Ritengo che tu abbia ragione, ma qual'è il modo  migliore di salvare i 
ritorni a capo nel campo del DB (uso MySQL)?
Leonardo

Come fai a dire che ט giusto?
Perche' dopo la parola "Dottoressa" (abbreviata in "Dr.ssa") c'e' un
secondo punto fermo.
Magari e' li' per errore... ma potrebbe darsi che "Dr.ssa" e "Bruni"
siano parti di due frasi staccate.
   "Dottoressa si abbrevia in Dr.ssa. Bruni quindi puo' firmare..."
Leonardo


 Leo
se continui ad accettare input in questo modo e per poi formattarli alla 
"buona" dopo.. finirai in un inferno
comunque prova qualcosa del genere.. 
<?php
$line =
"word . word ... word... ...word word." .
" number 9." .
" number 9.9 9.99 99.99.99 G. word Dr. Avv. Dr.ssa word word.word points." .
" . . . .. ... .... Mrs. word word.word." .
" shr.shr shr. ma." .
" word";
echo preg_replace(
    "/([0-9]|[^A-Z][a-z][a-z]|[a-z]{3,})\.(\s)/", 
    "$1.<br />\n", 
    $line
);
?>
non e' perfetto ma sembra funzionare in diversi casi..
oltretutto credo ci sia un bug nell'implementazione di preg_replace.. 
diciamo che un paio di volte su 100 php e' terminato senza output se non un 
inquietante segfault :-(
-- 
www.iuz-lab.info


La via piů semplice: salvare sul db l'informazione esattamente cosi come 
viene passata dalla text-area, senza filtrare nulla.
Cooper.
 


Quoto, però mi riferivo a tutt'altro.
E' consuetudine (salvo prova contraria) che la forma abbreviata di 
dottoressa si usa esclusivamente quando è preceduta dal nome, qualche 
esempio:
1) L'Avv. Rossi ha vinto la causa
2) La Dr.ssa Carli mi ha guarito da una malattia.
E' errato in italiano usare una abbreviazione in un altro contesto. E pur 
vero che con l'avvento degli sms e con l'abitudine di tagliare le vocali o 
parte delle parole sostituendole con numeri o con altre lettere 
onomatopeiche sta sconvolgendo tutta la lingua italiana... ma resta comunque 
di fatto che formalmente è sbagliato, da nessuna parte insomma troverai 
scritto:
1) la dr.ssa domani mi visiterà etc.
Cmq al di la di tutto questo, io credo come dicevo in un post precedente che 
è meglio intervenire alla fonte non alla destinazione, non sei daccordo 
anche tu? :)
Cooper. 


Scusa se insisto, ma uso PHP e MySQL solo da metà gennaio 2008.
Se io salvo il risultato di una text area "normalizzato" con 
$CContenitoreDati = mysql_real_escape_string($_POST["ContenitoreDati"])pui 
con UPDATE o INSERT INTO
com'è che quando li rileggo con una query select posso ritrovare i . (punto) 
e a capo?
Devo forse usare un comando prima di mysql_real_escape_string?
Grazie
Leo

anche tu? :)
Assolutamente: ho letto poi il tuo msg ("qui si va in un ambiente
esclusivamente umano dove la macchina non puň intervenire in modo
rigoroso") ed e' Vangelo.
Il mio suggerimento sulla regexp era solo un sistema per far buon
viso a cattivo gioco: diciamo che hai gia' un DB di testi e messi
male, t'inventi un sistema che per lo meno sbaglia [*quasi*] solo
se anche l'utente ha fatto qualche scorrettezza.
L'obiezione piu' grave al mio sistema e' quella che hai gia' dato
tu: "non tutte le frasi che hanno un punto necessariamente devono
andare a capo".
In un caso del genere, uno spiega per bene tutte cose al cliente,
e s'accerta che costui abbia capito (e firmato in modo leggibile)
che se non usa la soluzione buona, la tua, deve rassegnarsi a una
soluzione che a volte non funzionera'. Mi raccomando la firma :-)
Leonardo cinico


 ha scritto nel messaggio 
news:d5pxl.289143$FR.5...@twister1.libero.it...

Il ritorno e a capo corrisponde a dei caratteri di controllo #10 e #13 che 
tu non vedi (perchè di controllo) ma che ci sono.
Cooper. 

 ha scritto nel messaggio 
news:mlsxl.1398$mj5....@tornado.fastwebnet.it...

Grazie
Leo

 Cooper.
C'è qualcosa che mi sfugge, non dovrei rileggerli così?
$ACapo = chr(10) .chr(13);
$stringa = str_replace($ACapo,"<br />", $stringa);
Leo


Ti sfugge il fatto che sono caratteri di controllo e non li puoi gestire 
direttamente.
Cooper. 

 ha scritto nel messaggio 
news:uAvxl.1704$mj5....@tornado.fastwebnet.it...

ed allora come?
Leo


Ho già risposto alla domanda :) Intervieni alla fonte.
Se hai eliminato dal testo i ritorni a capo e quindi hai salvato il testo 
sul db senza i ritorni a capo, è impossibile andarli a ricostruire.
Invece intervenendo alla fonte, salva il contenuto della textarea sul db 
senza filtrare nulla, esattamente cosi come viene inviato al submit, e 
allora puoi intercettarli anche procedendo a ritroso.
Cooper.
 


// toglier ritorno carrello in questa maniera?
$Testo = ereg_replace("\r",'', $Testo);
$Testo = ereg_replace("\n\n", '</p><p>', $Testo);
$Testo = ereg_replace("\n", '<br />', $Testo);
Leo

 $Testo = ereg_replace("\n", '<br />', $Testo);
Il manuale, questo sconosciuto ;^)
php.net/nl2br
bye!

 bye!
L'ho trovata su PHP e MySQL di Kevin Yank (Mondadori)
ma se mi puoi dare un link
Ti ringrazio per 
http://it2.php.net/nl2br
Leo

 ma se mi puoi dare un link
stavo parlando del manuale on line... è ben fatto e completo. Tutte le
volte che ti viene in mente di scrivere una funzione per fare
qualcosa, prima guarda lì se qualcuno non l'ha già fatta ;^)
bye!

 ha scritto nel messaggio 
news:0FGxl.199600$Ca.3...@twister2.libero.it...

Questo ha senso solo se quei caratteri sono presenti alla fonte, se li hai 
filtrati già in partenza non hai concluso nulla.
Idem vale per la soluzione proposta nel post successivo.
Cooper.