Problème de regex

Signaler
Messages postés
68
Date d'inscription
vendredi 23 novembre 2007
Statut
Membre
Dernière intervention
14 mars 2012
-
Messages postés
239
Date d'inscription
samedi 21 février 2004
Statut
Membre
Dernière intervention
3 juin 2010
-
Bonjour à tous,

Je bloque sur un problème d'expressions régulières.

J'ai réalisé un petit éditeur de texte en Ajax, j'ai implémenté les différentes fonctionnalités des boutons et l'aperçu.

Mais j'ai un soucis sur la mise en forme, lorsque je fait plusieur espaces, quand je récupère le code et l'affiche je n'ai qu'un seule espace d'affiché.
Pour cela je doit remplacer les espaces par , sauf qu'uil ne doivent être remplacés que hors des balies (balies marquées par les symboles [ et ].

Comment dois-je procéder ?

Merci d'avance.

6 réponses

Messages postés
567
Date d'inscription
mercredi 4 octobre 2006
Statut
Membre
Dernière intervention
30 août 2011
10
Hello

En php ou en JavaScript ?

En php, ca semble marcher :
<?php
$chaine = "  toto tata [titi tutu]  dsds titi [ ds]";
echo $chaine.'
';
function trim_spaces($matches)
{
    return str_replace(" ", '-', $matches[1]).'['.$matches[2].']';
}
$chaine = preg_replace_callback('#(.*)\[(.*)\]#isU', 'trim_spaces', $chaine);
echo $chaine;
/*
  toto tata [titi tutu]  dsds titi [ ds]
--toto-tata-[titi tutu]--dsds-titi-[ ds]
*/
?>


Je te laisse trouver quoi remplacer pour changer les - en ...

_________________________________
Min iPomme
Messages postés
567
Date d'inscription
mercredi 4 octobre 2006
Statut
Membre
Dernière intervention
30 août 2011
10
C'est une piste... Ca marche pas toujours mon truck bidul... Je vais essayer d'améliorer ça, dis moi si toi tu y arrive...

Genre pour ca ca marche pas :
<?php
$chaine = "[titi tutu]  texte après ma balise";
$chaine = "Texte sans balise   ";
?>



_________________________________
Min iPomme
Messages postés
68
Date d'inscription
vendredi 23 novembre 2007
Statut
Membre
Dernière intervention
14 mars 2012

Salut.

Merci pour ton aide, c'est vrai je n'ai pas spécifié en quel langage je voulais le faire tout simplement parce qu'il il me faudrait une version javascript pour l'affichage en temps réel et une version php qui se trouve dasn la fonction de traitement du message avant envoi dans la base de donnée.

J'ai un peu de mal à comprendre comment fonctionne ton code je ne suis pas très à l'aise en regex... mais le problème que tu cite des cas qui ne fonctionnent pas j'y avais pensé avant, et comme solution j'avais pensé à : Il faut remplacer tout les espaces par des puis tout les qui se trouve dans des balises les refaire passer en espaces simple.

Tu en pense quoi ?
Messages postés
567
Date d'inscription
mercredi 4 octobre 2006
Statut
Membre
Dernière intervention
30 août 2011
10
C'est une solution oui mais ce que j'aime pas trop dans cette solution c'est que tu peux transformer un tappé par l'utilisateur...

Pour ce qui es de ma regex, c'est vrais que je ne l'ai pas expliquée :
#sert de délimiteur à ma regex
(.*)\[( veux dire : tous les caractères se trouvant avant le [
(.*)\] veux dire tout les caractères avant le ].

Ici je créé donc deux groupes d'inconus (.*) tout les caractères avant le [, deuxième groupe (.*) tous les caractères dans le []...
isU : Ce sont les options de la regex.
- i: case insensitive (insensible à la casse)
- s: le caractère spécial . remplace aussi les caractères blancs (\n...)
- U: Ungreedy, s'arrête à la première occurrence trouvée (pratique pour le BBCode, comme dans ton cas).

ensuite preg_replace_callback va appeler la fonction 'trim_spaces' pour les differentes occurences trouvées avec en paramètre les deux groupes de la regex...

Ensuite dans ma fonction trim_spaces, dans le premier groupe je remplace les espaces par des - et je replace le deuxième groupe...

_________________________________
Min iPomme
Messages postés
68
Date d'inscription
vendredi 23 novembre 2007
Statut
Membre
Dernière intervention
14 mars 2012

Salut,

Impécable merci pour ton explication, Je pense que même si ma regex était fausse la façon de s'y prendre est pas mal.

Dis moi si je me trompe mais il suffit de remplacer les espaces dans la chaine de caractère qui n'est pas entourée de [ et ] ou bien si il existe ces deux symboles autour il faut que le premier soit fermé et le second ouvert et on récupère la chaine se trouvant entre la fermeture et l'ouverture.

Parcontre si le raisonement est bon je ne sais pas comment le transformer en regex.
Messages postés
239
Date d'inscription
samedi 21 février 2004
Statut
Membre
Dernière intervention
3 juin 2010
1
Bonjour,

Pourquoi ne pas placer le texte parsé entre des balises ?