Se connecter / S'enregistrer
Votre question

[php ] remplacement dynamique de mots dans une $string

Tags :
  • Script
  • Programmation
Dernière réponse : dans Programmation
22 Décembre 2009 17:20:33

Salut à tous !
Je travaille actuellement sur les possibilités de traitement de texte en php.
Afin de faire des tests avec la fonction preg_replace,
j'ai réuni dans un dossier un vocabulaire de 200 gifs typographiques.

J'ai déja programmé la base du script, mais actuellement j'ai 200 ligne de preg replace pour chaque mot dont j'ai un gif correspondants. le tout tapé à la main et au copié collé . Peu intelligent :pt1cable:  !
voiçi l'adresse si vous voulez jeter un coup d'oeil: http://billbao1987.free.fr/ereg/

J'essaye à présent de programmer un script dynamique qui pour chaque image du dossier,
recherche dans ma $string les occurences de ce mot, puis les remplace par l'image correspondante.

j'ai commençé la structure globale, mais je n'arrive pas à coder la transformation du nom du fichier en variable $pattern recherché ..

--------------------------
voici ce que j'ai déja:
--------------------------

//compter le nbre de gifs disponibles dans le dossier gif/ ; qui contient bla.gif , bli.gif, et blo.gif:
$dir = "gifs/" ;

function count_files($dir)
{
$num = 0;

$dir_handle = opendir($dir);
while($entry = readdir($dir_handle))
if(is_file($dir.'/'.$entry))
$num++;
closedir($dir_handle);

return $num;
}

$total = count_files($dir);

$string= " bla bli bla bla "

// Remplacer chaque occurence d'un nom de fichier par le fichier correspondant.
$i = 1;
while ($i <= $total) {

$name= // là il me manque une fonction récupérant le nom d'un fichier correspondant à $i
$pattern= '~\b$name\b~i'
$replacement= " <img src=\"gifs/.$name..gif\"> "

$string= preg_replace($name, $replacement, $string);

$i++;
}

if ($i=200) {
echo $string ;
}


---------------------------------
là ou vous pouvez m'aider
---------------------------------

Comment récupérer à chaque while le nom d'un des gifs afin de m'en servir pour le scan et le remplacement preg_replace ?


:hello:  Merci à tous !

Alex, étudiant à l'école supérieure des arts décoratifs de Strasbourg.

Autres pages sur : php remplacement dynamique mots string

22 Décembre 2009 17:51:48

2 remarques :

- A mon gout tu prends le problème à l'envers. J'irais dans l'autre sens.
- Un str_replace semble largement suffisant pour ton problème.

Voici l'ago que j'aurais mis en place :

- Passage dans le dossier /images/
- listage de l'ensemble des fichiers gif avec la fonction glob().
- supression des caractères inutile dans le résultat de la fonction glob.
- boucle sur le tableau de résultat, tentative de str_replace systématique sur la chaine envoyé.
- impression du résultat.

NB : si on veut faire très bien les choses, au lieu de glob on peut utiliser le DirectoryIterator http://php.net/manual/en/class.directoryiterator.php. Moins simple à appréhender lorsqu'on est débutant.
m
0
l
22 Décembre 2009 18:04:04

Merci des pistes pour les fontions glob () et directory iterator ^^

pour le str_replace, au début j'utilisai ça,mais j'ai préferai preg_replace car
avec str_replace je ne pouvais différençier les "le" de "facile", de "electricité", de "lecture"; de celui de "le" ...

pour cela j'utilise les expressions régulières (PCRE) \b (délimiteurs de mots) lues par preg_* mais pas par str_replace ...

T'as une autre solution ?

je développe le reste en attendant, merci de ta contribution pour la structure et les fonctions mettre en place !

Alex
m
0
l
Contenus similaires
22 Décembre 2009 22:30:27

En effet tu as raison dans ce cas pour le preg_* même si l'ajout d'un espace aurait sans doute pu faire l'affaire.
m
0
l
a c 145 L Programmation
23 Décembre 2009 08:52:28

Je pense que tu te compliques réellement la tâche:
  1. <?php
  2. $string = "bli bla bli blo";
  3.  
  4. $output = array();
  5. $tmp = explode(' ', $string);
  6. foreach($tmp as $k => $v) {
  7. if (file_exists('gifs/'.$v.'.gif')) $output[] = '<img src="gifs/'.$v.'.gif">';
  8. else $output = $v;
  9. }
  10. $final = implode(' ', $output);
  11. echo $final;
  12. ?>
m
0
l
23 Décembre 2009 09:42:09

Il me semble que c'est presque bon ...

j'ai mon listage des fichiers avec ablation du nom de dossier et de l'extension ( substr ),

un for i< $total pour traiter en boucle le vocabulaire disponible ,

puis un if i=$total, pour finalement "echo" la $string remasterisé ...

Seul problème encore ...

le script ne reconnait pas mes variables inserées dans les délimiteurs de motifs PCRE ..

Je pense que c'est un problème de syntaxe ...


---------------------
le code actualisé
---------------------

$string = "bli bla bli";

//compter le nbre de gifs disponibles:

// la fonction count_files n'est pas détaillée ici pour plus de clarté
$total = count_files($dir);


//scanner le dossier et récupérer les noms des fichiers dans un array

$files=glob('gifs/*')?glob('gifs/*'):array();


// Scan en boucle de $string et remplacement des mots disponibles

for ($i = 0; $i < $total; $i++)
{
$name = $files[$i]; // affiche le fichier sous la forme "gifs/nomdufichier.gif"
$name_sans_dossier = substr($name, 5); // affiche le fichier sous la forme "nomdufichier.gif"
$name_sans_extension = substr($name_sans_dossier, 0, -4); // affiche le fichier sous la forme "nomdufichier"

$pattern= '~\b'.$name_sans_extension.'\b~i';
$replacement= " <img src=\"".$name".\"> ";

$string= preg_replace($pattern, $replacement, $string);
}

// affichage final
if ($i=200) {
echo $string ;
}



Comment bien insérer ma variable "$name_sans_extension" dans $pattern , de même pour $name dans $replacement ?

Merci :) 
m
0
l
23 Décembre 2009 10:09:09

crazycat@idn a dit :

if (file_exists('gifs/'.$v.'.gif')) $output[] = '<img src="gifs/'.$v.'.gif">';



J'ai testé ta proposition qui est, il est vrai, bien plus concise que la mienne !

J'ai un message d'erreur pour la ligne :

if (file_exists('gifs/'.$v.'.gif')) $output[] = '<img src="gifs/'.$v.'.gif">';

message :

Fatal error: [] operator not supported for strings in C:\wamp\www\string_replace.php on line 82
m
0
l
a c 145 L Programmation
23 Décembre 2009 10:49:38

Ah oui, une erreur de ma part:
Il faut remplacer:
  1. else $output = $v;

par:
  1. else $output[] = $v;
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS