Problème avec eregi_replace()

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Problème avec eregi_replace()

Re: Problème avec eregi_replace()

par Cobra52 » 24 déc. 2009, 12:35

Pour la résolution des espaces multiples, une expression régulière comme suit :
$name = preg_replace ('#[[:space:]]+#', '-', $name);
;)
Je prends, merci à toi :wink:

Re: Problème avec eregi_replace()

par Victor BRITO » 23 déc. 2009, 19:13

Pour la résolution des espaces multiples, une expression régulière comme suit :
$name = preg_replace ('#[[:space:]]+#', '-', $name);
;)

Re: Problème avec eregi_replace()

par Cobra52 » 23 déc. 2009, 18:47

C'est bon, j'y suis enfin arrivé, non sans mal :lol:
Merci à tous pour votre aide et plus particulièrement à Victor BRITO :wink: =D>

Re: Problème avec eregi_replace()

par Cobra52 » 23 déc. 2009, 18:28

J'ai enfin trouvé une solution sur le net concernant ce soucis de caractères accentués, donc j'y ai associé
$name = preg_replace('#\b\w{1,3}\b#i', '', $name);
$name = str_replace(' ', '-', $name);
le problème c'est que la première ligne remplace bien les mots de moins de 4 caractères par un espace, ce qui fait que je me retrouve avec :

Code : Tout sélectionner

texte de test de caractères accentués => texte--test--caracteres-accentues

Re: Problème avec eregi_replace()

par Cobra52 » 23 déc. 2009, 17:18

Pareil
Notice : iconv() [function.iconv]: Wrong charset, conversion from `UTF-8' to `ASCII//TRANSLIT//IGNORE' is not allowed in file ...
@>!{#} de charset !

Re: Problème avec eregi_replace()

par Victor BRITO » 23 déc. 2009, 17:01

Essaie un
echo iconv ('UTF-8', 'ASCII//TRANSLIT//IGNORE', $name);

Re: Problème avec eregi_replace()

par Cobra52 » 23 déc. 2009, 16:34

J'ai testé ça :
$name = iconv('UTF-8', 'ISO-8859-1//TRANSLIT//IGNORE', $name);
et j'ai cette erreur :

Code : Tout sélectionner

Notice : iconv() [function.iconv]: Wrong charset, conversion from `UTF-8' to `ISO-8859-1//TRANSLIT//IGNORE' is not allowed in file ...
pourtant j'ai juste changé US-ASCII par ISO-8859-1 !

Re: Problème avec eregi_replace()

par Victor BRITO » 23 déc. 2009, 15:56

Si tu cherches à supprimer les accents des caractères accentués, regarde du côté de la fonction iconv () et de la translittération.
$name = 'une chaîne de caractères comportant des caractères accentués';
$name = iconv ('UTF-8', 'US-ASCII//TRANSLIT//IGNORE', $name);
echo $name; // Affichera quelque chose comme une chaine de caracteres comportant des caracteres accentues

Re: Problème avec eregi_replace() et caractères accentués

par Cobra52 » 23 déc. 2009, 15:50

lol le c** !!!! Merci :oops:

Bon, j'ai testé mon utf8_decode() sur le texte et j'ai des petits carrés avec ff d'inscrit dedans, dans le code source.
comme ça : "act�res accentu�s-cat_1.html">"

Re: Problème avec eregi_replace()

par Victor BRITO » 23 déc. 2009, 14:44

Alors, avant de tester ton code, je souhaite virer mes caractères accentués.
Le texte est en utf8 dans la bdd et j'ai

Code : Tout sélectionner

charset=UTF-8
dans le header

J'ai donc fait un
$name = uft8_decode($name);
et j'ai cette erreur :

Code : Tout sélectionner

Fatal error: Call to undefined function uft8_decode() in ...
sous Easyphp2 Php5.2.3 et Apache 2.2.4 en local.

D'où vient le problème, svp ?
Inverse le f et le t : la fonction s'appelle utf8_decode (). ;)

Re: Problème avec eregi_replace()

par Cobra52 » 23 déc. 2009, 12:56

D'abord, je te conseille de laisser tomber les fonctions ereg_* () et eregi_* () : elles sont en voie d'obsolescence et PHP 5.3 génère un avertissement dans ce sens lorsqu'on les utilise. Les fonctions faisant appel aux expressions rationnelles compatibles Perl sont plus performantes.

On peut obtenir ce que tu cherches sans passer par une fonction. Essaie le code suivant :
$name = preg_replace ('#\b\w{1,3}\b#i', '', $name);
Le problème vient plus de l'expression régulière. Pour t'en assurer, tu peux utiliser l'outil de test mis au point par Ripat pour tester.
Je te remercie.
Alors, avant de tester ton code, je souhaite virer mes caractères accentués.
Le texte est en utf8 dans la bdd et j'ai

Code : Tout sélectionner

charset=UTF-8
dans le header

J'ai donc fait un
$name = uft8_decode($name);
et j'ai cette erreur :

Code : Tout sélectionner

Fatal error: Call to undefined function uft8_decode() in ...
sous Easyphp2 Php5.2.3 et Apache 2.2.4 en local.

D'où vient le problème, svp ?
Merci :)

Re: Problème avec eregi_replace()

par Victor BRITO » 22 déc. 2009, 22:48

D'abord, je te conseille de laisser tomber les fonctions ereg_* () et eregi_* () : elles sont en voie d'obsolescence et PHP 5.3 génère un avertissement dans ce sens lorsqu'on les utilise. Les fonctions faisant appel aux expressions rationnelles compatibles Perl sont plus performantes.

On peut obtenir ce que tu cherches sans passer par une fonction. Essaie le code suivant :
$name = preg_replace ('#\b\w{1,3}\b#i', '', $name);
Le problème vient plus de l'expression régulière. Pour t'en assurer, tu peux utiliser l'outil de test mis au point par Ripat pour tester.

Re: Problème avec eregi_replace()

par micetf » 22 déc. 2009, 22:34

Peux-tu donner un exemple de phrase que tu vas passer en paramètre à rewrite_mod
et ce que tu attends alors que cette fonction te retourne ?
Quelque chose comme ça ?
AVANT :
Je-souhaite-retirer-les-mots-de-moins-de-4-lettres-dans-des-phrases.
APRES :
souhaite-retirer-mots-moins-lettres-dans-phrases.
Fred

Re: Problème avec eregi_replace()

par Cobra52 » 22 déc. 2009, 18:24

Bonjour,
Est-ce qu'une solution de ce type ne pourrait pas convenir ?
function remplace($captures)
{
  $retour='';
  for ($i=1;$i<count($captures);$i++) {
    if (strlen($captures[$i])>3) $retour .= $captures[$i];
  }
  return $retour;
}
$phrase = "Je souhaite retirer les mots de moins de 4 lettres dans des phrases.";
echo preg_replace_callback('/(\w+)/', 'remplace', $phrase);
Fred
Oui, si l'on m'aide à l'intégrer :)
Voici ce que j'ai dans un fichier :
function rewrite_mod($name)
{
	$name = eregi_replace("-(.{1,4}-)+|^(.{1,4}-)+|(-.{1,4})+$", "-", $name);
	return($name);
}
et dans un autre :
$tpl->set_blocks('cat', array(
'CAT_ID' =>		$forum['f_id'],
'NAME' =>		htmlspecialchars($last_cat['f_name']),
/* Rewrite */
'U_CAT' =>		sid($this->rewrite_mod($last_cat['f_name']) . '-cat_' . $last_cat['f_id'] . '.html'),
));
Merci :)

Re: Problème avec eregi_replace()

par micetf » 22 déc. 2009, 17:46

Bonjour,
Est-ce qu'une solution de ce type ne pourrait pas convenir ?
function remplace($captures)
{
  $retour='';
  for ($i=1;$i<count($captures);$i++) {
    if (strlen($captures[$i])>3) $retour .= $captures[$i];
  }
  return $retour;
}
$phrase = "Je souhaite retirer les mots de moins de 4 lettres dans des phrases.";
echo preg_replace_callback('/(\w+)/', 'remplace', $phrase);
Fred