Pb regex php
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 ;)
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 ;)
Configuration: Windows XP Firefox 3.0.13
15 réponses
-
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 !
-
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 -
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
)
...
)
-
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 ^^ -
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 -
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 ! -
il ne prend pas non plus en compte le "f" qui precede le crochet
-
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 -
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 ! -
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 :) -
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 -
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 -
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.
-
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'); -
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 ;)