Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 28/08/2008, 12h44   #1
Candidat au titre de Membre du Club
 
Inscription : avril 2008
Messages : 49
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 49
Points : 12
Points : 12
Par défaut Gestion des espaces fines et insécables

Bonjour,

je planche actuellement pour trouver une solution simple de gestion des espaces insécabes et espaces fines insécables dans la ponctuation d'un texte. Malheureusement, ma connaissance du traitement de texte par PHP est assez limitée. je n'ai jamais travaillé avec les regexp par exemple.

Les signes de ponctuations concernés sont guillemets, point-virgule, deux points, point d'exclamation, point d'interrogation, le signe '°' de n°, et le signe %.

L'espace fine sera génére de la sorte (source):
Code :
1
2
3
4
HTML
    texte<span class="fine">&nbsp;</span>texte
CSS
    .fine { font-size: 30%; }
L'espace insécable ( &nbsp; ) sera inséré devant le signe "deux points". Les autres signes seront gérés par des espaces fines.

Deux importantes exceptions :
1- Les liens hypertextes doivent être épargnés (normal)
2- Il ne faut pas d'espace entre un signe de ponctuation et un guillement fermant suivi d'un point.

Voici donc en "image" ce que je veux faire :


Texte "visuel" :
Citation:
L'homme, venait de la plaine ; il affirma sans détour : "Oui, c'est moi ! Mais que veux-tu ?"
Elle, répondant, comme "embarrassé" : "puis-je me joindre à vous, on ma parlé de l'homme en noir."
Il avait effectué 50 % du trajet sur la route n° 12.
Le code html du même texte, non formaté :
Citation:
L'homme, venait de la plaine[espace ou rien]; il affirma sans détour[espace ou rien]:[espace ou rien]"[espace ou rien]Oui, c'est moi[espace ou rien]! Mais que veux-tu[espace ou rien]?"
Elle, répondant, comme [B]"[espace ou rien]embarrassé[espace ou rien]"[espace ou rien]: "[espace ou rien]puis-je me joindre à vous, on ma parlé de l'homme en noir."
Il avait effectué 50[espace ou rien]% du trajet sur la route [espace ou rien]12.
Le code html du même texte, une fois traité :
Citation:
L'homme, venait de la plaine<span class="fine">&nbsp;</span>; il affirma sans détour&nbsp;: "<span class="fine">&nbsp;</span>Oui, c'est moi<span class="fine">&nbsp;</span>! Mais que veux-tu<span class="fine">&nbsp;</span>?"
Elle, répondant, comme [B]"[B]<span class="fine">&nbsp;</span>embarrassé<span class="fine">&nbsp;</span>"&nbsp;: "<span class="fine">&nbsp;</span>puis-je me joindre à vous, on ma parlé de l'homme en noir."
Il avait effectué 50<span class="fine">&nbsp;</span>% du trajet sur la route <span class="fine">&nbsp;</span>12.
Résumé :
Code :
1
2
3
4
5
6
7
8
9
&nbsp;:
<span class="fine">&nbsp;</span>;
<span class="fine">&nbsp;</span>%
<span class="fine">&nbsp;</span>?
<span class="fine">&nbsp;</span>!
<span class="fine">&nbsp;</span>:
<span class="fine">&nbsp;</span>
"<span class="fine">&nbsp;</span> (ouvrant)
<span class="fine">&nbsp;</span>" (fermant)
Une des difficultés réside dans la détection des citations , et des guillemets ouvrants et fermants si on utilise les guillemets anglais. Si tel est le cas, il faudra utiliser les guillemets français (et peut-être un système permettant de les remplacer automatiquement).


Pour le moment, j'ai trouvé ce bout de code, issu du fichier /ecrire/inc/texte.php du logiciel Spip, mais je ne comprends pas tout :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
// Correction typographique francaise
// http://doc.spip.org/@typo_fr
function typo_fr($letexte) {
       static $trans;
 
       // Nettoyer 160 = nbsp ; 187 = raquo ; 171 = laquo ; 176 = deg ; 147 = ldquo; 148 = rdquo
       if (!$trans) {
               $trans = array(
                       "&nbsp;" => "~",
                       "&raquo;" => "»",
                       "&laquo;" => "«",
                       "&rdquo;" => "”",
                       "&ldquo;" => "“",
                       "&deg;" => "°"
               );
               $chars = array(160 => '~', 187 => '»', 171 => '«', 148 => '”', 147 => '“', 176 => '°');
               $chars_trans = array_keys($chars);
               $chars = array_values($chars);
               $chars_trans = implode(' ',array_map('chr',$chars_trans));
               $chars_trans = unicode2charset(charset2unicode($chars_trans, 'iso-8859-1', 'forcer'));
               $chars_trans = explode(" ",$chars_trans);
               foreach($chars as $k=>$r)
                       $trans[$chars_trans[$k]] = $r;
       }
 
       $letexte = strtr($letexte, $trans);
 
       $cherche1 = array(
               /* 1 */         '/((?:^|[^\#0-9a-zA-Z\&])[\#0-9a-zA-Z]*)\;/S',
               /* 2 */         '/»| --?,|(?::| %)(?:\W|$)/S',
               /* 3 */         '/([^[<!?])([!?])/S',
               /* 4 */         '/«|(?:M(?:M?\.|mes?|r\.?)|[MnN]°) /S'
       );
       $remplace1 = array(
               /* 1 */         '\1~;',
               /* 2 */         '~\0',
               /* 3 */         '\1~\2',
               /* 4 */         '\0~'
       );
       $letexte = preg_replace($cherche1, $remplace1, $letexte);
       $letexte = preg_replace("/ *~+ */S", "~", $letexte);
 
       $cherche2 = array(
               '/([^-\n]|^)--([^-]|$)/S',
               '/(http|https|ftp|mailto)~:/S',
               '/~/'
       );
       $remplace2 = array(
               '\1&mdash;\2',
               '\1:',
               '&nbsp;'
       );
       $letexte = preg_replace($cherche2, $remplace2, $letexte);
 
       return $letexte;
}
 
// rien sauf les "~" et "-,"
// http://doc.spip.org/@typo_en
function typo_en($letexte) {
 
       $cherche1 = array(
               '/ --?,/S'
       );
       $remplace1 = array(
               '~\0'
       );
       $letexte = preg_replace($cherche1, $remplace1, $letexte);
 
       $letexte = str_replace("&nbsp;", "~", $letexte);
       $letexte = ereg_replace(" *~+ *", "~", $letexte);
 
       $cherche2 = array(
               '/([^-\n]|^)--([^-]|$)/',
               '/~/'
       );
       $remplace2 = array(
               '\1&mdash;\2',
               '&nbsp;'
       );
 
       $letexte = preg_replace($cherche2, $remplace2, $letexte);
 
       return $letexte;
}
 
//
// Typographie generale
// note: $echapper = false lorsqu'on appelle depuis propre() [pour accelerer]
//
// http://doc.spip.org/@typo
function typo($letexte, $echapper=true) {
 
       // Plus vite !
       if (!$letexte) return $letexte;
 
       // Echapper les codes <html> etc
       if ($echapper)
               $letexte = echappe_html($letexte, 'TYPO');
 
       // Appeler les fonctions de pre-traitement
       $letexte = pipeline('pre_typo', $letexte);
       // old style
       if (function_exists('avant_typo'))
               $letexte = avant_typo($letexte);
 
       // Caracteres de controle "illegaux"
       $letexte = corriger_caracteres($letexte);
 
       // Proteger les caracteres typographiques a l'interieur des tags html
       $protege = "!':;?~%";
       $illegal = "\x1\x2\x3\x4\x5\x6\x7";
       if (preg_match_all(",</?[a-z!][^<>]*[!':;\?~%][^<>]*>,imsS",
       $letexte, $regs, PREG_SET_ORDER)) {
               foreach ($regs as $reg) {
                       $insert = $reg[0];
                       // hack: on transforme les caracteres a proteger en les remplacant
                       // par des caracteres "illegaux". (cf corriger_caracteres())
                       $insert = strtr($insert, $protege, $illegal);
                       $letexte = str_replace($reg[0], $insert, $letexte);
               }
       }
 
       // zouli apostrophe
       $letexte = str_replace("'", "’", $letexte);
 
       // typo francaise ou anglaise ?
       // $lang_objet est fixee dans l'interface privee pour editer
       // un texte anglais en interface francaise (ou l'inverse) ;
       // sinon determiner la typo en fonction de la langue
       if (!$lang = $GLOBALS['lang_objet'])
               $lang = $GLOBALS['spip_lang'];
       lang_select($lang);
       switch (lang_typo($lang)) {
               case 'fr':
                       $letexte = typo_fr($letexte);
                       break;
               default:
                       $letexte = typo_en($letexte);
                       break;
       }
 
       // Retablir les caracteres proteges
       $letexte = strtr($letexte, $illegal, $protege);
J'ai aussi trouvé ce plugin pour Dotclear (smartypants)


Je ne sais pas si je vais arriver à me dépatouiller de tout ça, ni comment créer mon bout de code autonome à moi.

Par la suite, j'aimerais faire en sorte de placer une insécable ( &nbsp; ) entre le numéro du jour et le mois. Exemple : 12&nbsp;juillet.

En tout cas, merci d'avance pour votre aide

Dernière modification par Guillaume.G ; 28/08/2008 à 17h46.
Guillaume.G est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2008, 13h58   #2
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 832
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 41
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 832
Points : 9 482
Points : 9 482
euh... en quoi pouvons-nous t'aider exactement ?
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 18h35.


 
 
 
 
Partenaires

Hébergement Web