FORMATAGE AUTOMATIQUE D'UN TEXT EN FONCTION DE MOTS CLÉES
cs_garfield90
Messages postés388Date d'inscriptionlundi 7 juillet 2003StatutWebmasterDernière intervention10 février 2009
-
11 mai 2007 à 00:55
_klesk
Messages postés70Date d'inscriptionjeudi 14 avril 2005StatutMembreDernière intervention20 août 2008
-
11 mai 2007 à 18:22
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
_klesk
Messages postés70Date d'inscriptionjeudi 14 avril 2005StatutMembreDernière intervention20 août 2008 11 mai 2007 à 18:22
impec merci kankrelune ca marche au poil.
j'ai pas tout compris mais je vais decortiquer tous ça.
si tu le permet je rajoute t'a version.
codefalse
Messages postés1123Date d'inscriptionmardi 8 janvier 2002StatutModérateurDernière intervention21 avril 20091 11 mai 2007 à 15:48
ok, je ne connaissais pas la fonction preg_quote .. en effet elle est tres utile :)
codefalse
Messages postés1123Date d'inscriptionmardi 8 janvier 2002StatutModérateurDernière intervention21 avril 20091 11 mai 2007 à 15:45
Autant pour moi a propos de php4 :/ :p
Une méthode peut-être un peu bourine, serait de :
_ Sauvegarder ta chaine dans une variable
_ faire le ereg replace sur ta chaine mise et des mot à remplacer le tout en miniscule
_ puis explode la variable de la chaine d'origine
_ et tu remplace tout les termes retournés de la fonction d'origine, mis en miniature, par les mêmes valeurs, mais avec la casse d'origine.
_ tu retourne le tout
Ne connaissant pas de fonction directe qui peux remplacer en étant insensible à la casse et en gardant la casse d'origine, c'est comme ca que je le verrai. Apres, ya ptete mieux (et vu comme c'est assez lourd je trouve, il doit y avoir mieux) ... mais c'est une solution ! :)
kankrelune
Messages postés1293Date d'inscriptionmardi 9 novembre 2004StatutMembreDernière intervention21 mai 2015 11 mai 2007 à 15:43
Oui c'est clair... mais fallait le préciser... dans ce cas là si tu est sous php4 utilise plutot les expressions regulières... du genre... .. .
_klesk
Messages postés70Date d'inscriptionjeudi 14 avril 2005StatutMembreDernière intervention20 août 2008 11 mai 2007 à 15:24
merci codefalse mais str_ireplace est dispo sous >PHP5 or je suis en PHP4 (et c'est pas possible de changer).
Non ce que je voulait c'est : dans ce cas, j'ai "CM", dans mon systeme de recherche je tape "cm" (avec eregi_replace, ca marche ;) ) alors j'ai bien "cm" en gras, mais en minuscule alors que dans la chaine d'origine il était en majuscule.
Je voudrait donc que lors de ma recherche il s'affiche tel qu'il etait dans la chaine même si mon mot clée est en minuscule.
Suis-je clair ??
codefalse
Messages postés1123Date d'inscriptionmardi 8 janvier 2002StatutModérateurDernière intervention21 avril 20091 11 mai 2007 à 15:03
Dans quel usage tu veux detecter la casse d'un caractère ?
parce que pour l'exemple de Kankrelune, la fonction str_replace est sensible à la casse ("C" != "c"), donc si ton "CM" pose probleme face au "cm", alors tu peux utiliser la fonction str_ireplace, qui est la version insensible à la casse de str_replace() (voir la doc php si tu veux plus d'info). Et donc là, ton "CM" est remplacé.
_klesk
Messages postés70Date d'inscriptionjeudi 14 avril 2005StatutMembreDernière intervention20 août 2008 11 mai 2007 à 14:27
Mais au final faire une fonction pour un str_replace() c'est plutôt inutile... ou alors on complique le truc genre on prend en compte les tableaux... genre... .. .
11 mai 2007 à 18:22
j'ai pas tout compris mais je vais decortiquer tous ça.
si tu le permet je rajoute t'a version.
11 mai 2007 à 15:48
11 mai 2007 à 15:45
Une méthode peut-être un peu bourine, serait de :
_ Sauvegarder ta chaine dans une variable
_ faire le ereg replace sur ta chaine mise et des mot à remplacer le tout en miniscule
_ puis explode la variable de la chaine d'origine
_ et tu remplace tout les termes retournés de la fonction d'origine, mis en miniature, par les mêmes valeurs, mais avec la casse d'origine.
_ tu retourne le tout
Ne connaissant pas de fonction directe qui peux remplacer en étant insensible à la casse et en gardant la casse d'origine, c'est comme ca que je le verrai. Apres, ya ptete mieux (et vu comme c'est assez lourd je trouve, il doit y avoir mieux) ... mais c'est une solution ! :)
11 mai 2007 à 15:43
function autoformat($string, $word, $style = 'font-weight:bold;')
{
if(is_array($word))
{
$i = -1;
while(isset($word[++$i]))
$word[$i] = '~('.preg_quote($word[$i],'~').')~i';
}
else $word = '~('.preg_quote($word,'~').')~i';
return preg_replace( $word , '$1', $string);
}
@ tchaOo°
11 mai 2007 à 15:24
Non ce que je voulait c'est : dans ce cas, j'ai "CM", dans mon systeme de recherche je tape "cm" (avec eregi_replace, ca marche ;) ) alors j'ai bien "cm" en gras, mais en minuscule alors que dans la chaine d'origine il était en majuscule.
Je voudrait donc que lors de ma recherche il s'affiche tel qu'il etait dans la chaine même si mon mot clée est en minuscule.
Suis-je clair ??
11 mai 2007 à 15:03
parce que pour l'exemple de Kankrelune, la fonction str_replace est sensible à la casse ("C" != "c"), donc si ton "CM" pose probleme face au "cm", alors tu peux utiliser la fonction str_ireplace, qui est la version insensible à la casse de str_replace() (voir la doc php si tu veux plus d'info). Et donc là, ton "CM" est remplacé.
11 mai 2007 à 14:27
echo autoformat('CM Sk 462 (AMD) - Asrock - K7NF2-RAID - SATA/DDR', array('cm', '462', 'Asrock'));
avec "cm" en minuscule, et le but de cette fonction était de mettre en gras les mot clé d'un listing de recherche MySQL.
Kankrelune, tu peu m'expliquer un peu t'a fonction ??
sinon, question annexe, peut on détecter si un lettre dans un mot est en majuscule ou pas ??
11 mai 2007 à 14:10
11 mai 2007 à 14:07
function autoformat($string, $word, $style = 'font-weight:bold;')
{
if(is_array($word))
{
$i = -1;
if(is_array($style))
{
while(isset($word[++$i]))
{
if(isset($style[$i]) && !empty($style[$i]))
$style[$i] = ''.$word[$i].'';
else
$style[$i] = ''.$word[$i].'';
}
}
else
{
$tmp = $style;
$style = array();
while(isset($word[++$i]))
$style[$i] = ''.$word[$i].'';
}
}
else $style = ' '.$word.'';
return str_replace( $word , $style, $string);
}
et ensuite tu fais...
echo autoformat('CM Sk 462 (AMD) - Asrock - K7NF2-RAID - SATA/DDR', array('CM', '462', 'Asrock'));
@ tchaOo°
11 mai 2007 à 13:58
function autoformat($string, $word, $style = 'font-weight:bold;')
{
return str_replace( $word , ''.$word.'', $string);
}
Mais au final faire une fonction pour un str_replace() c'est plutôt inutile... ou alors on complique le truc genre on prend en compte les tableaux... genre... .. .
function autoformat($string, $word, $style = 'font-weight:bold;')
{
if(is_array($word))
{
$i = -1;
while(isset($word[++$i]))
{
if(isset($style[$i]) && !empty($style[$i]))
$style[$i] = ''.$word[$i].'';
else
$style[$i] = ''.$word[$i].'';
}
}
else $style = ' '.$word.'';
return str_replace( $word , $style, $string);
}
Mais je reste septique quand à l'utilité de déclarer ça en fonction... .. .
@ tchaOo°
11 mai 2007 à 13:43
Le probleme avec t'a methode c'est que ca marche pas :
Ma methode :
//chaîne de caractères
$a = "CM Sk 462 (AMD) - Asrock - K7NF2-RAID - SATA/DDR";
//mot clées séparé par un espace
$b ="CM 462 Asrock";
retourne : CM Sk 462 (AMD) - Asrock - K7NF2-RAID - SATA/DDR
la tienne :
retroune : CM Sk 462 (AMD) - Asrock - K7NF2-RAID - SATA/DDR
rien
quand au balise je suis d'accord avec toutle monde, c'était m'a prochiane mise a jour
11 mai 2007 à 12:48
11 mai 2007 à 11:59
function autoformat($string, $word, $type = 'b')
{
return str_replace( $word , <'.$type.'>'.$word.'</'.$type.'>', $string);
}
@ tchaOo°
11 mai 2007 à 11:58
http://www.php.net/str_replace
==>
function autoformat($string, $word, $type = 'b')
{
return str_replace( $word , <'.$type.'>'.$word.'</'.$type.'>'$string);
}
pourquoi faire compliqué quand on peut faire simple... .. .
@ tchaOo°
11 mai 2007 à 00:55
$myTerm pouvant etre : un tableau d'expression rationnelle / une expression rationelle complexe
preg_replace($myTerm,'$0',$string) ;
je ne fais qu'une fois l'opération de mise en exergue (preg_replace), que toi tu le fais pour chaque terme ;)
perso, j'utiliserai plus la balise span avec une classe spécifique ce qui fait que pour changer le style, je modifie simplement mes CSS :)
a vérifier tout de meme car, j'ai fait ca a vu de nez