OVH Cloud OVH Cloud

Probleme avec ereg_replace...

9 réponses
Avatar
poste
Bonjour,

Voila mon probleme.

Je desire convertir une string a la volee en filtrant
les caracteres d'une classe determinee. Pour ce faire, j'utilise un
ereg_replace().

Voila comment :

$ts="Joyeux Nôël";
$reg="[^a-zA-Z0-9_., ]";
$rep="[\\1]";
$toto = ereg_replace($reg,$rep,$ts);

Ce qui fonctionne, j'ai bien en sortie > Joyeux N[ô][ë]l
Donc ma classe fonctionne et repere les caracteres desires.
Mais je veux le code ascii de ce caractere, donc ord();

Je code donc ceci :

$ts="Joyeux Nôël";
$reg="[^a-zA-Z0-9_., ]";
$rep="[". ord("\\1") ."]";
$toto = ereg_replace($reg,$rep,$ts);

Mais la, la fonction me retourne toujours le meme code (92).
J'ai donc en sortie > Joyeux N[92][92]l

Pourquoi ca marche pas ? Pourquoi la fonction me retourne le meme code
ascii dans le deuxieme cas alors que dans le premier, le caractere est
retourne correctement ?

Des idees ?

Merci d'avance !

David C u e l - O l l e r
V E N T I L O - s t u d i o

9 réponses

Avatar
Thibaut Allender
Dco wrote:

Mais la, la fonction me retourne toujours le meme code (92).
J'ai donc en sortie > Joyeux N[92][92]l

Pourquoi ca marche pas ? Pourquoi la fonction me retourne le meme code
ascii dans le deuxieme cas alors que dans le premier, le caractere est
retourne correctement ?


parce qu'il execute d'abord le ord (sur 1 - qui n'est pas encore
connu) et ensuite le replace, donc il remplace tout par la meme valeur
ord("1")

essaye ceci :

<?php
print ord("1");
?>

--> 92

tu ne peux pas utiliser une fonction dans un replace, puisque la
fonction fille sera toujours executee avant la fonction mere


a+

--
freelance + web design + php dev + digital photo
+ http://www.capsule.org

Avatar
Tof
Je code donc ceci :

$ts="Joyeux Nôël";
$reg="[^a-zA-Z0-9_., ]";
$rep="[". ord("1") ."]";
$toto = ereg_replace($reg,$rep,$ts);

Mais la, la fonction me retourne toujours le meme code (92).
J'ai donc en sortie > Joyeux N[92][92]l

Pourquoi ca marche pas ? Pourquoi la fonction me retourne le meme code
ascii dans le deuxieme cas alors que dans le premier, le caractere est
retourne correctement ?

Des idees ?


92 = ord(''), interprété dans ta ligne $rep="[". ord("1") ."]";

Peut-être avec
$toto = ereg_replace($reg,"[". ord("1") ."]",$ts); ?

Avatar
Christian
Bonjour,

Bonsoir,


Je code donc ceci :

$ts="Joyeux Nôël";
$reg="[^a-zA-Z0-9_., ]";
$rep="[". ord("1") ."]";
$toto = ereg_replace($reg,$rep,$ts);

Mais la, la fonction me retourne toujours le meme code (92).
J'ai donc en sortie > Joyeux N[92][92]l


92 est le code ascii du backslash ""

Pourquoi ca marche pas ? Pourquoi la fonction me retourne le meme code
ascii dans le deuxieme cas alors que dans le premier, le caractere est
retourne correctement ?

Des idees ?


peut-être en enlevant les guillemets à l'interieur de la fonction ord
=>ord(1)
mais je suis pas du tout sûr que ça marche.

Merci d'avance !
si ça marche, je suis d'accord.


Christian

Avatar
Olivier Miakinen

Je code donc ceci :

$ts="Joyeux Nôël";
$reg="[^a-zA-Z0-9_., ]";


Ok jusque ici.

$rep="[". ord("1") ."]";


Cette ligne est équivalente à :
$rep="[92]";
(92 est le code du backslash)

$toto = ereg_replace($reg,$rep,$ts);


Ici, il est déjà trop tard. Ton $rep ne contient plus aucun 1.

Mais la, la fonction me retourne toujours le meme code (92).
J'ai donc en sortie > Joyeux N[92][92]l


Normal. Voir ci-dessus.

Comme ça, sans trop réfléchir, je ne vois pas de solution simple avec
une regexp. Je pense que tu devras faire une boucle pour traiter les
caractères un par un.

Avatar
Olivier Miakinen

Peut-être avec
$toto = ereg_replace($reg,"[". ord("1") ."]",$ts); ?


Non, cela n'a aucune chance de marcher (idem pour la réponse de Christian).

Avatar
tyoup
Dco wrote:

Bonjour,

Voila mon probleme.

Je desire convertir une string a la volee en filtrant
les caracteres d'une classe determinee. Pour ce faire, j'utilise un
ereg_replace().
...

Ce qui fonctionne, j'ai bien en sortie > Joyeux N[ô][ë]l
Donc ma classe fonctionne et repere les caracteres desires.
Mais je veux le code ascii de ce caractere, donc ord();
...


Mais la, la fonction me retourne toujours le meme code (92).
J'ai donc en sortie > Joyeux N[92][92]l

Pourquoi ca marche pas ? Pourquoi la fonction me retourne le meme code
ascii dans le deuxieme cas alors que dans le premier, le caractere est
retourne correctement ?


bon ... yen a qui croient encore au Père Noël ... ;-)

ça ne marche pas parceque $rep n'est pas "du code exécutable", c'est une
chaîne de caractères fixée, ici elle vaut '[92]'.

en plus il n'y a pas de capture donc je ne vois pas quelle valeur on
peut espérer pour 1 ...

Des idees ?


pour exécuter du code dans une expression régulière, on peut utiliser
$toto = preg_replace('/([a-z...])/e','"[".ord($1)."]"',$ts);

Merci d'avance !


de rien

--
Tyoup

Avatar
poste
Dco wrote:

J'ai pige !

Mais il va me falloir en effet tester chaque caractere, ce que je
voulais eviter... Je me tourne donc vers un in_array() contenant les
caracteres a convertir.

Merci a tous !

David C u e l - O l l e r
V E N T I L O - s t u d i o
Avatar
P'tit Marcel
Dco écrivit:

Mais il va me falloir en effet tester chaque caractere, ce que je
voulais eviter...


non, il y a une solution simple en employant les regex :

$ts="Joyeux Nôël";

$toto = preg_replace_callback('`[x80-xFF]`',
create_function('$trouve','return "[".ord($trouve[0])."]";'),
$td);


eça
--
P'tit Marcel
(rtfm à tous ;-)

Avatar
poste
P'tit Marcel wrote:

Dco écrivit:

Mais il va me falloir en effet tester chaque caractere, ce que je
voulais eviter...


non, il y a une solution simple en employant les regex :

$ts="Joyeux Nôël";

$toto = preg_replace_callback('`[x80-xFF]`',
create_function('$trouve','return "[".ord($trouve[0])."]";'),
$td);


eça


Merci Monsieur, ca devrait fonctionner ton truc, j'my colle.

Et encore merci a tous !

Tres utile les NG !

A+

--- David Cuel-Oller ---
V E N T I L O s t u d i o