Comment découper une chaoine avec plsusieurs séparateurs.... [php] - Programmation
Marsh Posté le 05-12-2001 à 17:19:21
ya une commande qui s'appelle split et une autre explode
essai le
Marsh Posté le 05-12-2001 à 17:29:10
J'adore les Regexp :
<?php
$chaine = "titi? toto : tata , tutu. ;tyty!";
preg_match_all("/([^\,|;|:|!|?|.|\s]+)/",$chaine,$reg,PREG_PATTERN_ORDER);
$i=0;
while(strlen($reg[1][$i])!=0)
{
echo trim($reg[1][$i])."<br>";
++$i;
}
?>
Marsh Posté le 05-12-2001 à 17:32:55
je connais asses bien le regxp dit aussi expression réguliére
mais je ne connais pas cette fonction en PHP
preg_match_all
Marsh Posté le 05-12-2001 à 17:39:03
SteF_DOBERMANN a écrit a écrit : je connais asses bien le regxp dit aussi expression réguliére mais je ne connais pas cette fonction en PHP preg_match_all |
Elle fait partie de la librairie PCRE, autrement dit les expressions régulières compatible PERL ("Enfin, il y a quelques différences avec le PERL quand même).
http://www.php.net/manual/en/ref.pcre.php
----------
/\ | | /\
\/ |_| \/
| | | |
----------
@+
Marsh Posté le 05-12-2001 à 17:40:39
je connais asses bien le lmanguage Perl mais cette bib !!
Marsh Posté le 05-12-2001 à 17:42:52
XKobal a écrit a écrit : Voilà je voudrait découper un morceau de texte qui comporte plusieurs séparateurs (",;:!?. " ) afin d'isoler chaque mot. J'ai essayé avec strtok, mais le pb, c'est que lorsque 2 séparateur se suive, et bien la boucle s'arrette.... Merci de m'aider.. C'est pour le boulot. |
et prkoi ne pas remplacer tous les séparateurs par un seul avec strtr puis faire un explode sur ce séparateur unique?
Marsh Posté le 05-12-2001 à 17:43:57
Pas c'est super, tu connais tout !!!
Manque d'expérience alors ???
J'plaisante
Sacré loustiques toi et ton frère !!!
Marsh Posté le 05-12-2001 à 17:46:34
Je ne connais pas tout et suis loin de tout connaitre
Manque d'expérience en PHP oui c claire
Mon frere et moi une grande histoire
Marsh Posté le 05-12-2001 à 17:47:22
bon si c pour boulot on parle constructif
tu veux faire koi?
données en entrés => données en sortie
Marsh Posté le 05-12-2001 à 17:53:21
EUh, en fait, j'ai encore un peu besoin d'aide...
Donc, c'est bon, maintenant mon texte est découpé. J'ai fait cela pour comparer chaque mot à un lexique dans une base de donnée et si jamais le mot est le même alors il remplace par un lien.
Mais je bloque sur certaine choses. Comment ne pas tenir compte de la casse sans que par exemple si on a le mot "ont" dans le lexique, le mot "sont" ne soit pas pris pour le même mot avec le s...
Je sais pas si je suis clair !!!!
En gros, j'ai besoin d'un script pour parser un bloc de texte contenu dans une base et créer un lien sur chaque mot de se texte qui est contenu dans mon lexique !!!!!
Marsh Posté le 05-12-2001 à 17:56:40
j'aurais dit de monter un tableau de hachage (en Perl) ou une table de correspondance mais je ne connais pas de solution
PS : la case est je crois la différenciation entre les majuscules et les minuscules
Marsh Posté le 05-12-2001 à 17:59:07
Je galère durement... C'est pas mon boulot en plus... Moi ej fait du réseau d'habitude... et je bloque durement sur ça.
Si vous connaissez une solution aidez moi...
Marsh Posté le 05-12-2001 à 18:01:46
Citation : En gros, j'ai besoin d'un script pour parser un bloc de texte contenu dans une base et créer un lien sur chaque mot de se texte qui est contenu dans mon lexique !!!!! |
En perl j'aurais fait ca :
$texte =~ s/[\n_r]/ /sg;
#parse sur espace
my @tab = slipt(/ /,$texte);
#dans @tab tu auras 1 mot par cellule
for (@tab) {
#ensuite tu traite chaque mot
#avec mot du text qui se trouve dans $_
}
Marsh Posté le 05-12-2001 à 18:08:26
Si seulement je pouvais le faire en PErl !!!!!
Mais le contrat pour ce site stipule : PHP !!!!! pffffffff
Marsh Posté le 05-12-2001 à 18:16:26
XKobal a écrit a écrit : EUh, en fait, j'ai encore un peu besoin d'aide... Donc, c'est bon, maintenant mon texte est découpé. J'ai fait cela pour comparer chaque mot à un lexique dans une base de donnée et si jamais le mot est le même alors il remplace par un lien. Mais je bloque sur certaine choses. Comment ne pas tenir compte de la casse sans que par exemple si on a le mot "ont" dans le lexique, le mot "sont" ne soit pas pris pour le même mot avec le s... Je sais pas si je suis clair !!!! En gros, j'ai besoin d'un script pour parser un bloc de texte contenu dans une base et créer un lien sur chaque mot de se texte qui est contenu dans mon lexique !!!!! |
Dans ce cas, il n'est même pas nécessaire de découper ton texte, tu peux remplacer direct...
Là j'ai pas le temps, mais avec un preg_replace() ou autre fonction de "Je reconnais - Je remplace", c'est tout à fait possible...
Si j'ai le temps, je te fais cela demain...
@+
Marsh Posté le 05-12-2001 à 18:22:06
Citation : Dans ce cas, il n'est même pas nécessaire de découper ton texte, tu peux remplacer direct... |
Bah écoute, si tu as le temps d'ici demain, ça m'arranegrai vachement, car la pcre_lib, ej ne connais pas du tout.
J'ai essayé avec ereg et ça va pas trop à cause de la case...
Merci à toi en tout cas
Marsh Posté le 05-12-2001 à 18:23:32
t'as plus qu'a traduire
c pour ca que je t donner la commande slpit tout à l'heure,
elle existe aussi en PHP
il te suffit de trouver les bonnes fonctions PHP
comme ereg_replace("/[\n_r]/"," ",$text)
qui est à peut pret equivalent à $texte =~ s/[\n\r]/ /sg
enfin à vérifié
Vola
Marsh Posté le 05-12-2001 à 18:25:21
La casse, la case c'est pour faire Ungologolo...
-> eregi est insensible à la casse !!! Mais attention, les Regexp peuvent vite devenir un cauchemard pour les serveurs, si elles sont mal optimisées, sa rame et tu peux te tapper des "Time Out"...
@+
Marsh Posté le 05-12-2001 à 18:28:19
pas quand on a l'experience
Marsh Posté le 05-12-2001 à 18:28:46
Citation : La casse, la case c'est pour faire Ungologolo... |
lol pour la case !!!
J'ai testé eregi aussi, et là , j'ai eu un autre pb, par exemple si "Out" est un des mots de mon lexique, alors si on trouve le mot "tout" dans le texte et il remplace et ça donne "t<a href='#'>Out</a>". Donc, ça ne va pas non plus....
Marsh Posté le 05-12-2001 à 18:30:12
Citation : La casse, la case c'est pour faire Ungologolo... |
Et pour l'histoire du serveur, c'est aps grave, car ce sont des bouts de texte très court, le lexique n'excede pas les 100 mots et c'est un serveur dédié qui va éxécuter le script...
Marsh Posté le 05-12-2001 à 18:30:13
Le motif de ta RegExp est mal écrit, faut pas chercher plus loin...
Marsh Posté le 05-12-2001 à 18:31:57
Citation : Le motif de ta RegExp est mal écrit, faut pas chercher plus loin... |
Je pense que tu n'as pas tort !!!
Marsh Posté le 06-12-2001 à 09:43:10
Aller voilà un script qui devrait t'aider :
************************************************************
// La chaine où il faut effectuer les changements...
$chaine ="Basé sur NCSA Mosaic. NCSA Mosaic(TM) a été développé par le National Center for Supercomputing Applications à l'Université de l'Illinois à Urbana-Champaign.
Distribué sous contrat de licence par Spyglass, Inc.
Contient des logiciels de sécurité de RSA Data Security Inc.
Des parties de ce logiciel sont basées partiellement sur le travail de Independent JPEG Group.
Contient une licence de logiciel client SOCKS accordée par Hummingbird Communications Ltd.
Contient une licence de logiciel ASN.1 accordée par Open Systems Solutions, Inc.
Les composants multimédias, notamment Indeo(R), de logiciels vidéo, Indeo(R) audio et d'effets pour la création de sites Web sont fournis par Intel Corp.
La version Unix contient une licence de logiciel accordée par Mainsoft Corporation. Copyright (c) 1998 Mainsoft Corporation. Tous droits réservés. Mainsoft est une marque déposée de Mainsoft Corporation.
Avertissement : ce logiciel est protégé par la loi relative au droit d'auteur et par les conventions internationales. Toute personne ne respectant pas ces dispositions se rendra coupable du délit de contrefaçon et sera passible des sanctions pénales prévues par la loi.";
// Construire deux tableaux, -> faire un petit script pour cela, surtout si tes termes sont stockés en DB
//
// Exemple :
//
// $connect = @mysql_connect("SQL_HOST","USER","PASSWORD" );
// $cfgBase = "tabase";
// $query = "SELECT mot,lien FROM table_terme";
// $result = mysql_db_query ($cfgBase,$query) or die ("Erreur de connexion à la base de données" );
// $i=0;
// While($row = mysql_fetch_object($result)){
// $pattern[$i]='\'('.$row->mot.'\'i';
// $replace[$i]='<a href="'.$row->lien.'" target="_blank"><font color="#FF0000">$1</font></a>';
// ++$i;
// }
//
// Un qui contient les motifs de reconnaissance
// L'autre qui contient les expressions de remplacement
$pattern[0] = '\'(LICENCE)\'i'; //Le i rend la reconnaissance insensible à la casse.
$replace[0]= '<a href="http://www.hardware.fr/" target="_blank"><font color="#FF0000">$1</font></a>'; //$1 est une référence arrière (PHP ne cherche pas à l'évaluer car ma chaine est entre 'simple quote', elle correspond à l'expression entre parenthèses (dites capturantes !!!) dans le motif de reconnaissance.
$pattern[1] = '\'(intel)\'i';
$replace[1]= '<a href="http://www.intel.fr/" target="_blank"><font color="#FF0000">$1</font></a>';
$pattern[2] = '\'(open systems solutions)\'i';
$replace[2]= '<a href="http://www.lycos.fr/" target="_blank"><font color="#FF0000">$1</font></a>';
$chaine2 = preg_replace($pattern,$replace,$chaine); //La Regexp PCRE qui s'occupe de tout !!
echo "<br>".$chaine2."<br>"; //affichage de la chaine modifiée
************************************************************
@+
Marsh Posté le 06-12-2001 à 10:51:15
Citation : Aller voilà un script qui devrait t'aider : |
Merci bcp, ton script est super.... J'avais commencer comme toi , mais je ne connaissait aps la fonction preg_replace.
Mais j'ai encore un petit souci... Il y a tjs un pb. Si el mot "Out" est en patern, alors le mot "tout" sera remplcé par cela "tOut", et ça je sais que c'est parce qu'il voit le texte comme un bloc. c'est pour ça que hier, je voulais le découper d'abord pour pouvoir l'analyser après, qu'en penses tu ???
Ou as tu une autre solution...
Merci 1000 fois en tout cas.
IL y a juste un pb ....
Marsh Posté le 06-12-2001 à 10:53:03
SteF_DOBERMANN a écrit a écrit : t'as plus qu'a traduire c pour ca que je t donner la commande slpit tout à l'heure, elle existe aussi en PHP ![]() il te suffit de trouver les bonnes fonctions PHP comme ereg_replace("/[\n_r]/"," ",$text) qui est à peut pret equivalent à $texte =~ s/[\n\r]/ /sg enfin à vérifié Vola ![]() |
Ca a ni queue ni tête ta regexp !!! Pourquoi remplace les \n ou les \r par un espace !!! Aucun rapport avec son problème...
@+
Marsh Posté le 06-12-2001 à 11:53:56
XKobal a écrit a écrit : [quote] Merci bcp, ton script est super.... J'avais commencer comme toi , mais je ne connaissait aps la fonction preg_replace. Mais j'ai encore un petit souci... Il y a tjs un pb. Si el mot "Out" est en patern, alors le mot "tout" sera remplcé par cela "tOut", et ça je sais que c'est parce qu'il voit le texte comme un bloc. c'est pour ça que hier, je voulais le découper d'abord pour pouvoir l'analyser après, qu'en penses tu ??? Ou as tu une autre solution... Merci 1000 fois en tout cas. IL y a juste un pb .... |
Y-a une solution :
$pattern[0] = '\'([^\w])(LOI)([^\w])\'i';
$replace[0]= '$1<a href="http://www.hardware.fr/" target="_blank"><font color="#FF0000">$2</font></a>$3';
Tu ajoutes de ([^\w]) de part et d'autre du mot que tu veux reconnaitre et tu modifies le $replace en conséquence...
Là ca devrait être good...
@+
[edtdd]--Message édité par fly LM--[/edtdd]
Marsh Posté le 06-12-2001 à 11:54:15
Oups, j'm'a trompé, j'ai cliqué deux fois...
@+
[edtdd]--Message édité par fly LM--[/edtdd]
Marsh Posté le 06-12-2001 à 12:10:20
C'est impeccable, ça marche nickel....
Merci 1000 fois....
Dis moi tu connaitrais pas une doc bien faite , voir un bouquin assez pointus sur les expressions régulières, car ça reste un grosse lacune pour moi ....
Marsh Posté le 06-12-2001 à 13:22:55
XKobal a écrit a écrit : C'est impeccable, ça marche nickel.... Merci 1000 fois.... Dis moi tu connaitrais pas une doc bien faite , voir un bouquin assez pointus sur les expressions régulières, car ça reste un grosse lacune pour moi .... |
Oui monsieur, "Maîtrise des expressions régulières" de chez O'Reilly : http://www.oreilly.fr/catalogue/regex.html
Dans ce bouquin, tu apprends à façonner tes expressions, comment fonctionne les différents moteur de Regexp... En gros, si tu comprends complètement ce bouquin, les expressions régulières n'auront plus aucun secret pour toi. Maintenant, ce bouquin ne traite pas de PHP, on parlera beaucoup du PERL qui est un langage où les expressions régulières sont très puissantes...
Il y a des docs sur les Regexp sous "PHP", mais ces docs vont juste te déballer la doc officielle avec quelques petits exemples, mais ça ne t'expliquera pas le fonctionnement intime du moteur de regexp et la manière de façonner une regexp...
Cf : http://www.php.net/ la doc officielle
http://www.phpinfo.net/ tu trouveras deux articles sympas sur les Regexp en PHP (1 la lib standard, l'autre sur la PCRE)
@+ Bonne lecture...
Marsh Posté le 05-12-2001 à 17:13:39
Voilà je voudrait découper un morceau de texte qui comporte plusieurs séparateurs (",;:!?. " ) afin d'isoler chaque mot. J'ai essayé avec strtok, mais le pb, c'est que lorsque 2 séparateur se suive, et bien la boucle s'arrette....
Merci de m'aider.. C'est pour le boulot.