Flux rss
Collection CommentCaMarche.net
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Non résolu

Ereg_replace : pb de regexp

Edouard, le mardi 28 août 2007 à 14:56:24
Bonjour,
j'ai un problème de regexp.

je veux faire le remplacement de mots (stockés dans une base mysql) par des liens hypertextes :

exemple :
j'ai ma table remplacement :
musée | http://www.musee.com

j'ai une chaîne de caractère :
$string="ma chaîne avec les mots à remplacer : musée, ou Musée ou musée, ou musée. Mais attention pas musées.";

ICI je n'arrive pas à trouver la bonne fonction et la mettre en oeuvre pour remplacer musée ou Musée suivit ou non de caractères de ponctuation mais pas quand le mot fait partie d'une autre mot (musées).

En effet str_replace et stri_replace ne le permettent pas car systématiquement php me mettra le mot musée en minuscule et ne tiendra pas compte des espaces.

Le mieux pour l'instant c'est çà, qui gère les espaces de part et d'autre, mais je ne gère pas les ponctuations :
$SEARCH=array("musée");
$REPLACE=array("<a...> musée </a>");
$BIGREPLACE=array("<a...> Musée </a>");
foreach ($SEARCH as $key => $value){
$string2=str_replace(str_pad($value, strlen($value)+2," ", STR_PAD_BOTH),$REPLACE["$key"],str_replace(str_pad(ucfirst($value), strlen($value)+2," ", STR_PAD_BOTH),$BIGREPLACE["$key"],$string));
}

Si quelqu'un sait comment utiliser ereg_replace, pour faire ce que je recherche je serais preneur.

Merci d'avance.

Edouard
Répondre à Edouard  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
rénolipus, le mardi 28 août 2007 à 16:06:45
Salut,

Avec preg_replace() c'est mieux ;)

En mettant en gras les mots par exemple :
echo preg_replace('#\bmusée\b#i', '<b>$0</b>', $string);

\b est tout ce qui n'est pas un caractères de mot.
Répondre à rénolipus

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Edouard, le mardi 28 août 2007 à 16:25:46
Merci pour l'info, je vais tester ce soir.
Si je veux conserver ma boucle, comment met on une variable dans ta regex ?

'#\b$value\b#i' ? ça passe ça ?

merci d'avance
Edouard
Répondre à Edouard

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
rénolipus, le mardi 28 août 2007 à 17:02:38
Oui en mettant ta variable dans le pattern.
preg_replace('#\b' . $value . '\b#i', '<b>$0</b>', $string);
Par contre si $value est un array, il faut procéder autrement, pas besoin de foreach()
$value = array('musée', 'monument', 'collection");
$string = preg_replace('#\b(' . implode('|', $value) . '\b#i', '<b>$0</b>', $string);
Répondre à rénolipus

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 Edouard, le mardi 28 août 2007 à 18:17:13
Salut,

Je suis pas sûr de saisir ce que tu voulais faire avec implode mais finalement et grâce à ton aide, j'ai réussi à faire ce que je voulais, voici une solution à fignioler mais foncionnelle :

Dans une base MySQL j'ai la structure suivante :
CREATE TABLE `annuaire` (
`id` INT NOT NULL AUTO_INCREMENT ,
`motcle` VARCHAR( 20 ) NOT NULL ,
`infobulle` VARCHAR( 100 ) NOT NULL ,
`url` VARCHAR( 100 ) NOT NULL ,
`target` INT( 1 ) NOT NULL ,
PRIMARY KEY ( `id` ) 
);


Dans un fichier fonction.php j'ai cette fonction :
// Retourne les valeurs remplacées de l'annuaire
function AnnuWord($chaine,$SEARCH,$REPLACE,$BIGREPLACE){
$chaine = preg_replace("[\r\s]", "", $chaine);
foreach ($SEARCH as $key => $value){
$pattern="#\b".$value."\b#";
$bigpattern="#\b".ucfirst($value)."\b#";
$replacement=$REPLACE["$key"];
$bigreplacement=$BIGREPLACE["$key"];
$chaine = preg_replace($pattern,$replacement,$chaine);
$chaine = preg_replace($bigpattern,$bigreplacement,$chaine);
}
return $chaine;
}


Dans un fichier annutool.php j'ai le script suivant :
<?
// tableau de caractères spéciaux
$carspec=array("'","\"");
$carremp=array("´",""");
// Requête de remplacement
$sqlreplace=mysql_query("select* from annuaire");
$nbrlignesqlreplace=mysql_num_rows($sqlreplace);//nombre de ligne
if ($nbrlignesqlreplace=="0"){
echo AuStripSlashes("Il n'y a pas de données de remplacement !");
}//fin if
else{
while ($rowsqlreplace=mysql_fetch_array($sqlreplace))
{
// récupération des valeurs ligne à ligne
$Id_replace=$rowsqlreplace["id"];
$motcle_replace=$rowsqlreplace["motcle"];
//pour ne pas être ennuyé par les apostrophes
$infobulle_replace=str_replace($carspec,$carremp,$rowsqlreplace["infobulle"]);
$url_replace=$rowsqlreplace["url"];
$target_replace=$rowsqlreplace["target"];
//echo "$rowsqlreplace[infobulle]<br>";
//echo "$infobulle_replace";
//affectation des colonnes dans les tableaux 'SEARCH'
$SEARCH[]=$motcle_replace;
//$SEARCH[]=str_pad($motcle_replace, strlen($motcle_replace)+2, " ", STR_PAD_BOTH);
//affectation des colonnes dans les tableaux 'REPLACE'
if($target_replace=="1"){
// on utilise un target blank
$lieninfobulle="<a target=\"_blank\" href=\"".$url_replace."\" OnMouseOver=\"BulleWrite('".$infobulle_replace."');\" OnMouseOut=\"BulleHide ();\">".$motcle_replace."</a>";
$REPLACE[]=$lieninfobulle;
$BIGlieninfobulle="<a target=\"_blank\" href=\"".$url_replace."\" OnMouseOver=\"BulleWrite('".$infobulle_replace."');\" OnMouseOut=\"BulleHide ();\">".ucfirst($motcle_replace)."</a>";
$BIGREPLACE[]=$BIGlieninfobulle;
}//fin if
else{
// on ouvre le lien dans la même page
$lieninfobulle="<a href=\"".$url_replace."\" OnMouseOver=\"BulleWrite('".$infobulle_replace."');\" OnMouseOut =\"BulleHide ();\">".$motcle_replace."</a>";
$REPLACE[]=$lieninfobulle;
$BIGlieninfobulle="<a href=\"".$url_replace."\" OnMouseOver=\"BulleWrite('".$infobulle_replace."');\" OnMouseOut =\"BulleHide ();\">".ucfirst($motcle_replace)."</a>";
$BIGREPLACE[]=$BIGlieninfobulle;
}//fin else
// ensuite on appliquera le remplacement de mot dans les chaines aux variables issues de la seconde requête
}//fin while
}//fin else
?>


Dans tous les fichiers où il y a des chaînes qui pourraient contenir des mots à remplacer je traite les chaines avec la fonction comme ceci :

// en haut de page 'j'initialise mon script annutool.php :
// initialisation du moteur de remplacement
if(file_exists("annutool.php")) include("annutool.php");

...

// plus loin je traite mes chaines de caractères (ici issues d'une requête sql) :
$Texte2_actualite_ligne=AnnuWord($row["Texte2_actualite"],$SEARCH,$REPLACE,$BIGREPLACE);


A améliorer par qqn qui connait la programmation objet pour faire une vraie class, son initialisation et une fonction propre, mais bon déjà ça marche !

Edouard
Répondre à Edouard

Résultats pour ereg_replace : pb de regexp

Javascript - L'objet RegExp Les particularités de l'objet RegExp L'objet RegExp est un objet permettant de manipuler des expressions régulières, c'est-à-dire des modèles créés à l'aide de caractères ASCII permettant de manipuler des chaînes de caractères, afin de trouver des... www.commentcamarche.net/contents/javascript/jsregexp.php3
Ereg_replace (Résolu) Bonjour, Je cherche encore à manipuler une chaine de caractère avec un ereg_replace. Je parse un fichier texte ligne par ligne. La chaine que je souhaite modifir est ainsi faite : ( début de chaine) 1,041206,RE,411ABC, ( chaine coupée ici, le reste... www.commentcamarche.net/forum/affich-2845945-ereg-replace
[SHELL] regexp pour exprimer -N (Résolu) Bonjour, Je suis en train de faire un sed, et je cherche comment faire pour dire par exemple que je cherche à supprimer la chaine "-N"... J'arrive pas a faire en sorte qu'il prenne le tiret...une regexp qui fasse ca je veux dire... Si besoin... www.commentcamarche.net/forum/affich-3407637-shell-regexp-pour-exprimer-n

Résultats pour ereg_replace : pb de regexp

[RegExp] Récupérer une adresse IPFinalité Mise en œuvre Explications Interprétation du motif Récupérer une adresse IP Finalité Pour récupérer une IP dans un fichier texte, fichiers journaux, pages web, etc. Mise en œuvre L'expression régulière suivante combinée à la... www.commentcamarche.net/faq/sujet-911-regexp-recuperer-une-adresse-ip
Sed - SubstitutionSubstitution Substitution basique Simple Globale Ciblée Substitution conditionnée Simplee Avancée Bloc Avancéé Substitution basique Simple - 1ère occurrence (de chaque ligne) rencontrée uniquement sed 's/la/LA/'... www.commentcamarche.net/faq/sujet-5588-sed-substitution
Sed - Trucs et astucesTrucs et astuces en vrac Substitution Affichage Suppression Espace et tabulation Ligne vide Intervalle régulier Divers Substitution Substituer "foo" par "bar" à chaque ligne Seulement la 1ère occurrence sed 's/foo/bar/' Seulement... www.commentcamarche.net/faq/sujet-6699-sed-trucs-et-astuces

Résultats pour ereg_replace : pb de regexp

Javascript et regexp (Résolu)Bonjour, en javascript j'utilise cette fonction function calc(mot,str) { var c = /motrecherché \(\s([\d.]{1,})/; c.exec(str); if(RegExp.$1) return "motrecherché : "+RegExp.$1+"\n"; else return "" } cette fonction fonctionne mais j'aimerai... www.commentcamarche.net/forum/affich-3780249-javascript-et-regexp
[PERL] supprimer commentaire (Résolu)Bonjour, Est ce que quelqu'un sait comment supprimer les commentaires dans un fichier avec les regexp. Je voudrais une ligne de commande du genre : $tab[$_] =~ .... où $tab est un tableau, j'y met chaque ligne de mon fichier. Merci... www.commentcamarche.net/forum/affich-7636985-perl-supprimer-commentaire
Expression régulière PHP (Résolu)Bonjour, Je souhaiterai utiliser la fonction ereg_replace ou preg_replace (je n'en sais trop rien) afin d'arriver au résultat suivant : Chaine d'origine : [img='url_img']texte alternatif[ /img] Chaine finale : www.commentcamarche.net/forum/affich-8541193-expression-reguliere-php

Résultats pour ereg_replace : pb de regexp

Télécharger TextWranglerTextWrangler est un éditeur de texte évolué. Il propose de nombreuses fonctionnalités : recherche/remplacement simple ou sur plusieurs fichiers utilisation d'expressions rationnelles (regexp) comparaisons de fichiers presse-papiers... www.commentcamarche.net/telecharger/telecharger-34055075-textwrangler