Infos

Espaces insécables automatiques en PHP

Voici une petite fonction PHP pour éviter que vos textes passent à la ligne n'importe où.

Ce problème se manifeste souvent sur du texte inséré dans une base de donnée par un formulaire Web. En effet, les champs textarea ne permettent pas d'insérer autre chose que des espaces simples.

Ainsi, à partir de ce texte :

Je demandais si le numéro 3 allait sortir, lorsque M. Dupond est venu la revoir !

On peut, selon la taille disponible, arriver à ce résultat :

Je demandais si le numéro
3 allait sortir, lorsque M.
Dupond est venu la revoir
!

Il ne devrait pas y avoir de retour à la ligne entre « numéro » et « 3 » ainsi qu'entre « M. » et « Dupond », de même pour « revoir » et le point d'interrogation. Pour éviter ce comportement, il suffis de remplacer l'espace posant problème par une espace insécable (code HTML  ). D'autres règles basiques sont facilement implémentables.
On va pour cela utiliser la fonction preg_replace qui remplace le texte capturé à partir d'une expression régulière.

preg_replace utilisé pour insérer des espaces insécables

$texte = 'Je demandais si le numéro 3 allait sortir, lorsque M. Dupond est venu la revoir !';

echo preg_replace('/
(
    \40(?:
        [\!\?»:%]|
        ;\40
        )
    |
        \b(?:
            (?:M\.|Mr|Mme|Mle|Mlle|Melle|MM\.|MMes|Mles|Mlles|Melles|Me|Dr|Dir\.?|Cie|av\.|Sainte?|Ste?)\40\p{Lu}|
            (?:[Nn]uméro|[Nn]º|[Nn]os|[Pp]age|[Aa]rticle|[Aa]rt\.)\40\d+|
            \d+\40(?:\$|€|£|[Ee]uros?|[Dd]ollards?|[Ll£]ivres?|km|m|mètres?|cm|mm|kg|Km|M|Kg|ko|MHz|Go|Mo|°C)\b|
            [IVX]+e?\40(?:siècle|république)\b|
            (?:livre|titre|chapite|chap)\40[IVX]+\b
        )
    |
        [«]\40
    )
/exsS',
"str_replace(' ', ' ', '\\1')",
$texte);

Ce qui affiche :

Résultat

Je demandais si le numéro 3 allait sortir, lorsque M. Dupond est venu la revoir !

Cette fonction sans être exhaustive corrige un certain nombre de choses.

Comme d'habitude avec les expressions régulières le code n'est pas facilement compréhensible et peu élégant. L'option « x » permet de mettre un peu en forme la regex. L'option « e » avec preg_replace permet d'écrire la fonction de callback directement entre guillemets (rapide, mais pas très élégant). Si vous désirez en savoir plus sur les expressions régulières, je vous invite à vous reportez à la très complète documentation du manuel PHP :

Note : Je ne me préoccupe pas des espaces fines, elles ne sont pas encore utilisables sur le Web.

0.028' | CSS | XHTML 1.0 Strict
© 7px.net | Choisir un style : archycal | classic | cleersea