splitter une chaine suivant 2 delimiteurs

risa83
Invité n'ayant pas de compte PHPfrance

21 mai 2007, 11:22

Bonjour,

Je souhaite splitter une chaine suivant 2 delimiteurs dans un tableau.
J'ai trouvé la fonction basique "preg_split" qui à partir d'un chaine découpe suivant un délimiteur et range le resultat dans un tableau.

Pour résoudre mon problème, j'ai pensé créer une fonction qui split une première fois la chaine suivant mon 1er delimiteur puis qui parcourt le tableau créé afin de retirer les éléments ne contenant pas mon 2ème delimiteur ...

Le problème de cette fonction est que le temps de traitement risque d'etre un peu long.

Pensez vous que c'est la meilleure solution?

Merci

Mammouth du PHP | 1029 Messages

21 mai 2007, 11:27

Et pourquoi ne pas remplacer ton deuxième délimiteurs par le premiers et puis splitter?
L'expérience est la somme de toutes nos erreurs.

Mammouth du PHP | 505 Messages

21 mai 2007, 12:17

Et pourquoi pas utiliser split() qui est fait pour ca et capable de gérer autant de séparateur que l'on veut ?

Invité
Invité n'ayant pas de compte PHPfrance

21 mai 2007, 13:03

Je pense que la meilleure solution est de la forme :
$str = 'aaa:xxx/mmm:zzz/truc:chose';
$tab = explode('/', $str);

$dump = array();

foreach ($tab as $line)
    $dump[] = explode(':', $line);

// $dump vaudra :
//  0 => array('aaa', 'xxx')
//  1 => array('mmm', 'zzz')
//  2 => array('truc', 'chose')

Invité
Invité n'ayant pas de compte PHPfrance

21 mai 2007, 13:07

Pardon, j'ai posté un peu vite ...
Une condition peut être ajoutée dans le foreach afin de ne garder que les chaines contenant le délimiteur :
// Solution strchr()
foreach ($tab as $line)
    if (strchr(':', $line) !== false) $dump[] = explode(':', $line);

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

21 mai 2007, 13:11

Pensez vous que c'est la meilleure solution?
Il n'y a pas de "meilleure solution", tout dépend du type de données, la taille moyenne des chaînes, le nombre de chaînes à traiter, le nombre d'éléments par chaînes, etc...

preg_split() a les meilleures chances d'être rapide et constant, mais si tu veux une meilleure réponse il faudrait nous en dire un petit peu plus.

risa83
Invité n'ayant pas de compte PHPfrance

21 mai 2007, 14:22

@Hubert Roksor :
Pour etre un peu plus précis, mon but est de récupérer le positionnement d'un recherche sur un moteur de recherche. Les 2 délimiteurs me permettent de calculer le positionnement au fur et à mesure en fonction du code source résultant...

J'espere avoir été clair :lol:

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

21 mai 2007, 15:58

Est-ce que tes résultats de recherche sont dans un tableau, ou bien ce sont les mots précis (donc chaîne) que tu veux repérer ?
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Eléphanteau du PHP | 26 Messages

21 mai 2007, 17:19

@mere-teresa: Je veux stocker toutes les chaines présentes entre les 2 deéimiteurs

Par expl: Délimiteur1=*8 et Délimiteur2=$32

$str= "*8 aabbcc $32 fsdlk *8 ddeeff $32 nlsd"

je veux pouvoir récupérer "aabbcc" et "ddeeff" que je stocke dans un tableau ..

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

21 mai 2007, 17:38

En expression régulière ce que tu veux faire c'est matcher tout ce qui est entre Delim1 et Delim2, et dans ce langage ça se dit Delim1(.*?)Delim2.
Un preg_match_all() avec cette expression régulière te donnera ce que tu cherches (et n'oublie pas d'appliquer un coup de preg_quote() sur tes délimiteurs vu qu'ils ont des caractères zarbi).

Eléphanteau du PHP | 26 Messages

21 mai 2007, 17:46

Merci je ne connaissais pas cette fonction

Je vais tester

:D