Discussion:
php / expression regulieres et tinymce
(trop ancien pour répondre)
Anthony
2009-04-24 13:58:58 UTC
Permalink
Je suis confronté à un truc qui m'hallucine... mais peut être que
quelques esprits éclairés y verront mieux que moi.

J'ai une fonction qui supprime les paragraphes vide (de type <p> </p>).

Je suis pas fortiche en expression régulière mais ça donne ça :

$texte=eregi_replace('<p>[[:space:]]*</p>','',$texte);

Je récupère des infos dans une base.

Si l'info a été insérée manuellement dans la base... ma fonction
"fonctionne" très bien lorsque je la récupère (excusez le jeu de mot).

Par contre, si je rentre l'info avec tinymce (l'éditeur WYSIWYG), ça ne
fonctionne pas... et c'est de lui dont j'ai besoin.

Le pire, c'est que si je fait un mélange des deux (ajout depuis tinymce
puis manuellement)... seules disparaissent les balises créees manuellement.

Dans le source final j'ai une petite nuance... mais fait la voir :

ICI SEULEMENT LES BALISES TINY :

<p> </p> <- balise transmise par tiny
<p> </p> <- balise transmise par tiny
<p> </p> <- balise transmise par tiny
<p> </p> <- balise transmise par tiny
</div>

ICI LE MELANGES DES DEUX :

<p> </p> <- balise transmise par tiny
<p> </p> <- balise transmise par tiny
<p> </p> <- balise transmise par tiny
<p> </p> <- balise transmise par tiny
<p> </p></div> <- balise insérée à la main

On constate seulement que tiny m'ajoute un retour à la ligne dans le
code (\n je suppose).

Si quelqu'un peut m'aider...

Anthony
Christophe Bachmann
2009-04-24 15:12:29 UTC
Permalink
Post by Anthony
J'ai une fonction qui supprime les paragraphes vide (de type <p> </p>).
$texte=eregi_replace('<p>[[:space:]]*</p>','',$texte);
Je récupère des infos dans une base.
Si l'info a été insérée manuellement dans la base... ma fonction
"fonctionne" très bien lorsque je la récupère (excusez le jeu de mot).
Par contre, si je rentre l'info avec tinymce (l'éditeur WYSIWYG), ça ne
fonctionne pas... et c'est de lui dont j'ai besoin.
Le pire, c'est que si je fait un mélange des deux (ajout depuis tinymce
puis manuellement)... seules disparaissent les balises créees manuellement.
Est-ce que vos balises crées par l'éditeur contiennent bien une espace,
ou s'agit-il d'un quelconque caractère blanc mais codé différemment ?
--
Greetings, Salutations,
Guiraud Belissen, Château du Ciel, Drachenwald,
Chris CII, Rennes, France
Olivier Miakinen
2009-04-24 15:12:30 UTC
Permalink
Bonjour,
Post by Anthony
Je suis confronté à un truc qui m'hallucine... mais peut être que
quelques esprits éclairés y verront mieux que moi.
J'ai une fonction qui supprime les paragraphes vide (de type <p> </p>).
$texte=eregi_replace('<p>[[:space:]]*</p>','',$texte);
Je récupère des infos dans une base.
Si l'info a été insérée manuellement dans la base... ma fonction
"fonctionne" très bien lorsque je la récupère (excusez le jeu de mot).
Par contre, si je rentre l'info avec tinymce (l'éditeur WYSIWYG), ça ne
fonctionne pas... et c'est de lui dont j'ai besoin.
Je n'ai peut-être pas tout compris de tes explications, mais si je
devine bien il est possible que ton éditeur insère un caractère blanc
non pris en compte par [:space:].

Il me semble que les caractères en questions (du moins dans la locale
par défaut) soient les suivants :
- espace " "
- saut de page "\f"
- saut de ligne "\n"
- retour chariot "\r"
- tabulation horizontale "\t"
- tabulation verticale "\v"

Si ça se trouve, le caractère inséré par ton éditeur est une espace
insécable ("\xa0" en ISO-8859-*)

Et donc, si jamais ma boule de cristal est en état et que ton charset
est par exemple ISO-8859-1, tu peux essayer :
$texte=eregi_replace('<p>[[:space:]\xa0]*</p>','',$texte);

Voire, pour maîtriser un peu plus et en supposant que tu ne risques pas
d'avoir un saut de page ou une tabulation verticale :
$texte=eregi_replace('<p>[ \n\r\t\xa0]*</p>','',$texte);
Anthony
2009-04-27 12:39:02 UTC
Permalink
Post by Olivier Miakinen
Je n'ai peut-être pas tout compris de tes explications, mais si je
devine bien il est possible que ton éditeur insère un caractère blanc
non pris en compte par [:space:].
Il me semble que les caractères en questions (du moins dans la locale
- espace " "
- saut de page "\f"
- saut de ligne "\n"
- retour chariot "\r"
- tabulation horizontale "\t"
- tabulation verticale "\v"
Si ça se trouve, le caractère inséré par ton éditeur est une espace
insécable ("\xa0" en ISO-8859-*)
Et donc, si jamais ma boule de cristal est en état et que ton charset
$texte=eregi_replace('<p>[[:space:]\xa0]*</p>','',$texte);
Voire, pour maîtriser un peu plus et en supposant que tu ne risques pas
$texte=eregi_replace('<p>[ \n\r\t\xa0]*</p>','',$texte);
Merci de votre aide.
Mes pages sont en utf8.
J'ai donc essayé avec :
eregi_replace('<p>[ \n\r\t\xa0\x20]*</p>','',$texte);

mais pas moyen, les <p> </p> ne sont pas supprimés.
je ne suis pas sûr pour le x20 mais il me semble que c'est l'espace
insécable codé en utf8.

bien à vous,

Anthony
Olivier Miakinen
2009-04-27 13:12:44 UTC
Permalink
Post by Anthony
Post by Olivier Miakinen
[...]
Si ça se trouve, le caractère inséré par ton éditeur est une espace
insécable ("\xa0" en ISO-8859-*)
La première chose à faire, et j'aurais probablement dû l'écrire, c'est
quand même de vérifier ce qu'il y a *vraiment* dans ce texte.
Post by Anthony
Post by Olivier Miakinen
[...]
Merci de votre aide.
Mes pages sont en utf8.
eregi_replace('<p>[ \n\r\t\xa0\x20]*</p>','',$texte);
En UTF-8, \xa0 n'a aucune chance d'être pris pour une insécable. Note au
passage que [:space:] n'avait pas plus de chances de marcher...

<cit. http://www.miakinen.net/vrac/charsets/?pr=160>
Codage UTF-8 : C2 A0
</cit.>

Donc :
eregi_replace('<p>([ \n\r\t]|\xc2\xa0)*</p>','',$texte);
Post by Anthony
je ne suis pas sûr pour le x20 mais il me semble que c'est l'espace
insécable codé en utf8.
Que ce soit en ASCII, en ISO-8859-* ou en UTF-8, \x20 représente une
espace normale (sécable). D'ailleurs tous les caractères présents dans
ASCII se codent à l'identique dans tous les ISO-8859-* et dans UTF-8 ;
c'est au delà de \x7f que ça se gâte.
Anthony
2009-04-28 12:02:56 UTC
Permalink
Post by Olivier Miakinen
eregi_replace('<p>([ \n\r\t]|\xc2\xa0)*</p>','',$texte);
Bon, j'ai tenté et ça ne marche toujours pas.
Un grand merci pour les conseils...
J'ai donc suivi le conseil de Patrick... je sais c'est moins propre mais
ça fonctionne et j'ai déjà pas mal/trop passé de temps dessus.

j'ai donc utilisé : eregi_replace('<p>([^A-Za-z0-9])*</p>','',$texte);

déduction inverse.

anthony

Patrick Mevzek
2009-04-24 15:12:30 UTC
Permalink
Post by Anthony
Je suis confronté à un truc qui m'hallucine... mais peut être que
quelques esprits éclairés y verront mieux que moi.
J'ai une fonction qui supprime les paragraphes vide (de type <p> </p>).
$texte=eregi_replace('<p>[[:space:]]*</p>','',$texte);
Je récupère des infos dans une base.
Si l'info a été insérée manuellement dans la base... ma fonction
"fonctionne" très bien lorsque je la récupère (excusez le jeu de mot).
Par contre, si je rentre l'info avec tinymce (l'éditeur WYSIWYG), ça ne
fonctionne pas... et c'est de lui dont j'ai besoin.
Pas sûr que cela vous aide, mais êtes vous sûr à 100% que ce sont les
mêmes espaces dans les deux cas ? Pour avoir eu le problème (dans un
contexte complétement différent), êtes-vous sûr de ne pas avoir des
&nbsp; dans un cas et pas dans l'autre, et ces derniers ne sont pas
nécessairement attrapés par [[:space:]] (à vérifier dans la
documentation).

Sinon, à défaut un contournement par correspondance négative, du genre
[^a-z0-9]
(à adapter)
peut solutionner le problème aussi, mais c'est plus ou moins satisfaisant.
--
Patrick Mevzek . . . . . . . . . . . . . . Dot and Co
<http://www.dotandco.net/> <http://www.dotandco.com/>
<http://www.dotandco.net/ressources/icann_registrars/prices>
<http://icann-registrars-life.dotandco.net/>
Continuer la lecture sur narkive:
Loading...