Problème avec eregi_replace()

Eléphant du PHP | 153 Messages

22 déc. 2009, 15:36

Bonjour à tous,

Je souhaite retirer les mots de moins de 4 lettres dans des phrases, j'utilise :
$name = eregi_replace("-(.{1,4}-)+|^(.{1,4}-)+|(-.{1,4})+$", "-", $name);
mais ça ne fonctionne pas, la phrase n'est pas modifiée.

Si je fais juste :
$name = str_replace(" ", "-", $name);
ça fonctionne bien, donc la variable n'est pas en cause.

Une aide serait la bienvenue.
Merci :wink:

Eléphant du PHP | 65 Messages

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

Eléphant du PHP | 153 Messages

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 :)

Eléphant du PHP | 65 Messages

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

Mammouth du PHP | 2937 Messages

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.

Eléphant du PHP | 153 Messages

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 :)

Mammouth du PHP | 2937 Messages

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 (). ;)

Eléphant du PHP | 153 Messages

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">"

Mammouth du PHP | 2937 Messages

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

Eléphant du PHP | 153 Messages

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 !

Mammouth du PHP | 2937 Messages

23 déc. 2009, 17:01

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

Eléphant du PHP | 153 Messages

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 !

Eléphant du PHP | 153 Messages

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

Eléphant du PHP | 153 Messages

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>

Mammouth du PHP | 2937 Messages

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);
;)