Pb regex php

Fermé
mouf13 Messages postés 142 Date d'inscription mardi 20 juin 2006 Statut Membre Dernière intervention 22 février 2011 - 12 août 2009 à 17:35
Zep3k!GnO Messages postés 2025 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 18 novembre 2015 - 13 août 2009 à 10:32
Bonjour,

Un petit exemple clair :

$search = 'toto est [un idiot]';

Je souhaiterai avoir comme retour (avec preg_match_all)
array(0 => 'toto', 1 => 'est', 2 => [un idiot]);


Voici ma regex actuelle, qui ne me récupere que [un idiot] preg_match_all('#\[.*\]|^\s(\w)\s$)#', $search, $occ)

Pas moyen de recuperer les mots entre espaces...

Merci d'avance à l'âme charitable qui m'aidera ;)
A voir également:

15 réponses

Zep3k!GnO Messages postés 2025 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 18 novembre 2015 200
12 août 2009 à 17:49
Salut, tu est sûr du nombre d'espace et tout ? donnes le type de données que tu veux chercher, donnes qques exemples avec lesquels ca doit fonctionner , j'aime bien les regExp moi ;)
0
mouf13 Messages postés 142 Date d'inscription mardi 20 juin 2006 Statut Membre Dernière intervention 22 février 2011 17
12 août 2009 à 17:56
Je cherche a affiner mon moteur de recherche, donc éffectivement l'utilisateur pourra taper la saisie qu'il veut (avec un ou plusieurs espaces)
Désolé, mais je ne vois pas trop quoi rajouter à mon post précédent qui me parait clair :


$search = 'toto est [un idiot]';

Je souhaiterai avoir comme retour (avec preg_match_all)
array(0 => 'toto', 1 => 'est', 2 => [un idiot]);

ou encore....
$search = 'toto [est un] idiot';
array(0 => 'toto', 1 => '[est un]', 2 => 'idiot');
0
Zep3k!GnO Messages postés 2025 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 18 novembre 2015 200
12 août 2009 à 17:58
Oh oh oki en gros tu veux chaque mot c'est ca ?

car moi sinon juste comme ca pour ton 1er exemple sinon j'avais fait "<?php
$sSearch = 'toto est [un idiot]';
$sPattern = '#^([^ ]+) ([^ ]+) (.*)$#';
preg_match_all($sPattern, $sSearch, $aMatches);
echo "<pre>".print_r($aMatches, true)."</pre>";
?>"

P.S : a noter que ton expression régulière est mal écrite a la base.
0
mouf13 Messages postés 142 Date d'inscription mardi 20 juin 2006 Statut Membre Dernière intervention 22 février 2011 17
12 août 2009 à 18:02
non, je veux precisement mon exemple, cad que si un occurence est entre crochet elle doit etre compris comme une seule entrée de mon tableau, meme si elle contient de mot separés par un espace.

Merci pour ton aide
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mouf13 Messages postés 142 Date d'inscription mardi 20 juin 2006 Statut Membre Dernière intervention 22 février 2011 17
12 août 2009 à 18:05
preg_match_all('#^([^ ]+) ([^ ]+) (.*)$#', $search, $occ)
me renvoi

array(4) {
[0] = array(1) {
[0] = string(22) "toto est [un idiot] sd"
}
[1] = array(1) {
[0] = string(4) "toto"
}
[2] = array(1) {
[0] = string(3) "est"
}
[3] = array(1) {
[0] = string(13) "[un idiot] sd"
}


et ceci preg_match_all('#\[.*\]|^([^ ]+) ([^ ]+) (.*)$#', $search, $occ)
me renvoie
array(4) {
[0] = array(1) {
[0] = string(19) "toto est [un idiot]"
}
[1] = array(1) {
[0] = string(4) "toto"
}
[2] = array(1) {
[0] = string(3) "est"
}
[3] = array(1) {
[0] = string(10) "[un idiot]"
}
}

ce qui est presque bon mais j'aimerai ne pas avoir de tableau a double entrée, inutiles dans mon cas
0
Zep3k!GnO Messages postés 2025 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 18 novembre 2015 200
12 août 2009 à 18:07
Bon après je sais pas si c'est exactement ça car ca prend pas les caractères accentuées, j'ai la flemme de les rajouter :)

<?php
$sSearch = 'toto est [un idiot]';
$sPattern = '#(\^\+\])|([a-zA-Z0-9][^ ]+)#';
preg_match_all($sPattern, $sSearch, $aMatches);
echo "<pre>".print_r($aMatches, true)."</pre>";
?>

Retourne

Array
(
[0] => Array
(
[0] => toto
[1] => est
[2] => [un idiot]
)

[1] => Array
(
[0] =>
[1] =>
[2] => [un idiot]
)

[2] => Array
(
[0] => toto
[1] => est
[2] =>
)

)

Avec $aMatches[0] qui contient finalement ce que tu voulais...
C'est bon pour toi ?


P.S: du coup ta reg exp est pas toute fausse que je l'ai mis dans le post du dessus, je pensais que tu voulais pas les [ ]... autant pour moi :)
0
mouf13 Messages postés 142 Date d'inscription mardi 20 juin 2006 Statut Membre Dernière intervention 22 février 2011 17
12 août 2009 à 18:10
c'est bon pour moi, n'y a t'il pas un moyen pour ne générer qu'un seul tableau ? quant aux caractères accentués ils sont encodés dans ma base donc pas de soucis de ce coté là.


Merci beaucoup pour ton aide utile !
0
mouf13 Messages postés 142 Date d'inscription mardi 20 juin 2006 Statut Membre Dernière intervention 22 février 2011 17
12 août 2009 à 18:14
tout compte fait mon résultat n'est pas du tout correct :)

avec comme recherche : "toto est [un idiot] f"
j'ai

array(3) {
[0] = array(4) {
[0] = string(4) "toto"
[1] = string(3) "est"
[2] = string(2) "un"
[3] = string(6) "idiot]"
}
[1] = array(4) {
[0] = string(0) ""
[1] = string(0) ""
[2] = string(0) ""
[3] = string(0) ""
}
[2] = array(4) {
[0] = string(4) "toto"
[1] = string(3) "est"
[2] = string(2) "un"
[3] = string(6) "idiot]"
}

il me vire le crochet d'ouverture et ne considere pas [un idiot] comme une seul ligne
0
mouf13 Messages postés 142 Date d'inscription mardi 20 juin 2006 Statut Membre Dernière intervention 22 février 2011 17
12 août 2009 à 18:14
il ne prend pas non plus en compte le "f" qui precede le crochet
0
Zep3k!GnO Messages postés 2025 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 18 novembre 2015 200
12 août 2009 à 18:19
Petite modification :
$sPattern = '#(\^\+\])|([a-zA-Z0-9][^ $]*)#';
la ca prend le f :)
0
Zep3k!GnO Messages postés 2025 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 18 novembre 2015 200
12 août 2009 à 18:16
Non tu ne peux pas avoir qu'un seul tableau
"Si order est omis, PREG_PATTERN_ORDER est utilisé par défaut."
Et avec PREG_PATTERN_ORDER : L'ordre est tel que $matches[0] est un tableau qui contient les résultats qui satisfont le masque complet, $matches[1] est un tableau qui contient les résultats qui satisfont la première parenthèse capturante, etc.

source : http://fr3.php.net/manual/fr/function.preg-match-all.php

voilà ;)
Pas de soucis, bonne continuation !
0
mouf13 Messages postés 142 Date d'inscription mardi 20 juin 2006 Statut Membre Dernière intervention 22 février 2011 17
12 août 2009 à 18:22
J'ai du me tromper dans mon post précedent, la recherche et soumis par le biais d un script ajax et le chargement ne devais pas etre fini.

resultat de toto est [un idiot] de

array(4) {
[0] = array(1) {
[0] = string(22) "toto est [un idiot] de"
}
[1] = array(1) {
[0] = string(4) "toto"
}
[2] = array(1) {
[0] = string(3) "est"
}
[3] = array(1) {
[0] = string(13) "[un idiot] de"
}
}

donc c presque bon mais l'occurence suivant la ] n'est pas trouvée
0
mouf13 Messages postés 142 Date d'inscription mardi 20 juin 2006 Statut Membre Dernière intervention 22 février 2011 17
12 août 2009 à 18:24
tu as mis :
P.S: du coup ta reg exp est pas toute fausse que je l'ai mis dans le post du dessus, je pensais que tu
voulais pas les [ ]... autant pour moi :)

si je peux avoir array(..., 2 => 'un idiot' au lieu de '[un idiot]' c encore mieux ^^
0
Zep3k!GnO Messages postés 2025 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 18 novembre 2015 200
12 août 2009 à 18:25
moi ca passe pour

<?php
$sSearch = 'toto est [un idiot] de ';
$sPattern = '#(\^\+\])|([a-zA-Z0-9][^ $]*)#';
preg_match_all($sPattern, $sSearch, $aMatches, PREG_PATTERN_ORDER );
echo "<pre>".print_r($aMatches, true)."</pre>";
?>
Array(
[0] => Array
(
[0] => toto
[1] => est
[2] => [un idiot]
[3] => de
)
...
)
0
mouf13 Messages postés 142 Date d'inscription mardi 20 juin 2006 Statut Membre Dernière intervention 22 février 2011 17
12 août 2009 à 18:32
bizarre vous avez dit bizarre ?

$sSearch = 'toto est [un idiot] de ';
$sPattern = '#(\^\+\])|([a-zA-Z0-9][^ $]*)#';
preg_match_all($sPattern, $sSearch, $aMatches, PREG_PATTERN_ORDER );
echo "<pre>".print_r($aMatches, true)."</pre>";

->

Array
(
[0] => Array
(
[0] => toto
[1] => est
[2] => un
[3] => idiot]
[4] => de
)

[1] => Array
(
[0] =>
[1] =>
[2] =>
[3] =>
[4] =>
)

[2] => Array
(
[0] => toto
[1] => est
[2] => un
[3] => idiot]
[4] => de
)

)
bon je crois que j'ai trop la tete dedans, ca fait 2 jours que je suis bloqué sur cette @#@# de regex, je vais aller m'aerer avant de jeter l'ordi par la fenetre :)

merci encore pour ton aide
0
Zep3k!GnO Messages postés 2025 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 18 novembre 2015 200
13 août 2009 à 10:32
Hello, normal j'avais pas vu mais le serveur a mal interprété mon code !

Arfff j'arrive pas a t'envoyer la bonne version, si tu veux donnes ton mail et je te le mail !
0