[php] Comment découper une chaoine avec plsusieurs séparateurs....

Comment découper une chaoine avec plsusieurs séparateurs.... [php] - Programmation

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.

Reply

Marsh Posté le 05-12-2001 à 17:13:39   

Reply

Marsh Posté le 05-12-2001 à 17:19:21    

ya une commande qui s'appelle split et une autre explode
essai le


---------------
Tout à commencé par un rêve...
Reply

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;
}
 
?>

Reply

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


---------------
Tout à commencé par un rêve...
Reply

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
 
----------
/\ | | /\
\/ |_| \/
|  | | |
----------
 
@+

Reply

Marsh Posté le 05-12-2001 à 17:40:39    

je connais asses bien le lmanguage Perl mais cette bib !!


---------------
Tout à commencé par un rêve...
Reply

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?

Reply

Marsh Posté le 05-12-2001 à 17:43:57    

Pas c'est super, tu connais tout !!!
 
Manque d'expérience alors ???
 
J'plaisante :lol: :lol: :lol:
 
Sacré loustiques toi et ton frère !!!

Reply

Marsh Posté le 05-12-2001 à 17:44:50    

Merci pour vos réponses, c'est parafit !!!!!! =)

Reply

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


---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 05-12-2001 à 17:46:34   

Reply

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


---------------
Tout à commencé par un rêve...
Reply

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

Reply

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


---------------
Tout à commencé par un rêve...
Reply

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

Reply

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 $_
}


---------------
Tout à commencé par un rêve...
Reply

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

Reply

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...
@+

Reply

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...  
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...  
@+  


 
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

Reply

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


---------------
Tout à commencé par un rêve...
Reply

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"...
 
@+

Reply

Marsh Posté le 05-12-2001 à 18:28:19    

pas quand on a l'experience :lol:


---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 05-12-2001 à 18:28:46    

Citation :

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"...  
 
@+


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

Reply

Marsh Posté le 05-12-2001 à 18:30:12    

Citation :

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"...
 
@+


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

Reply

Marsh Posté le 05-12-2001 à 18:30:13    

Le motif de ta RegExp est mal écrit, faut pas chercher plus loin...

Reply

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

Reply

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
 
************************************************************
@+

Reply

Marsh Posté le 06-12-2001 à 10:51:15    

Citation :

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  
 
************************************************************  
@+


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

Reply

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




 
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...
@+

Reply

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]

Reply

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]

Reply

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

Reply

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

Reply

Marsh Posté le 06-12-2001 à 14:39:43    

MErci bcp !!!!!!!

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed