188 votes

Php délimiteurs multiples dans explode

J'ai un problème, j'ai un tableau de chaînes de caractères, et je veux l'exploser avec différents délimiteurs. Par exemple

$example = 'Appel @ Ratte';
$example2 = 'apple vs ratte'

et j'ai besoin d'un tableau qui soit explosé en @ ou vs.

J'ai déjà écrit une solution, mais si vous avez une meilleure solution, veuillez la poster ici.

private function multiExplode($delimiters,$string) {
    $ary = explode($delimiters[0],$string);
    array_shift($delimiters);
    if($delimiters != NULL) {
        if(count($ary) <2)                      
            $ary = $this->multiExplode($delimiters, $string);
    }
    return  $ary;
}

0 votes

Je n'ai jamais vu de questions auxquelles les gens répondaient par "Que pensez-vous de ceci" ou "Que pensez-vous de cela".

350voto

SergeS Points 4917

Essayez de l'utiliser :

$output = preg_split('/ (@|vs) /', $input);

0 votes

Incroyable. Je me demande ce que ça donne par rapport à explode() sur des arguments simples

8 votes

Peu importe, si vous voulez faire un grand système avec une analyse syntaxique difficile des chaînes de caractères, le moyen le plus efficace est votre propre analyseur. Par ailleurs, cela n'a pas beaucoup d'effet sur la vitesse du système, mais vous préférez utiliser la méthode la plus simple pour vous (pour être rentable).

13 votes

Notez que certains caractères doivent être échappés pour pouvoir fonctionner (comme les caractères / , ? ). Par exemple : preg_split("/(\/|\?|=)/", $foo); .

85voto

John Ballinger Points 4193

Vous pouvez prendre la première chaîne de caractères, remplacer toutes les @ con vs en utilisant str_replace puis exploser sur vs ou vice versa.

1 votes

Solution facile, j'ai fini par l'utiliser pour le code Json pour remplacer "}}" par "|". Sale mais efficace :) !

7 votes

Quel génie :D

0 votes

Cela ne fonctionnera pas correctement lorsqu'un délimiteur est un sur-ensemble de l'autre (par ex. (@|@!) cas)

14voto

Aubry Points 71

Que diriez-vous d'utiliser strtr() pour remplacer tous vos autres délimiteurs par le premier ?

private function multiExplode($delimiters,$string) {
    return explode(
        $delimiters[0],
        strtr(
            $string,
            array_combine(
                array_slice(    $delimiters, 1  ),
                array_fill(
                    0,
                    count($delimiters)-1,
                    array_shift($delimiters)
                )
            )
        )
    );
}

C'est un peu illisible, je suppose, mais je l'ai testé comme fonctionnant ici.

Les "one-liners" ftw !

12voto

Mchl Points 32343

N'est-ce pas ? strtok() travailler pour vous ?

2 votes

Vu que son délimiteur est 'vs', cela peut ne pas fonctionner car la documentation php dit : strtok() divise une chaîne (str) en chaînes plus petites (tokens), chaque token étant délimité par n'importe quel caractère de token. et 'vs' contient deux caractères

1 votes

La réponse serait meilleure si vous incluiez une explication ou un exemple. en l'état, il s'agit plutôt d'un commentaire...

1voto

Nanne Points 35880

Vous allez rencontrer quelques problèmes (que faire si vous avez cette chaîne : "vs @ pommes" par exemple) en utilisant cette méthode de saisie, mais si nous commençons par dire que vous avez pensé à cela et que vous avez corrigé toutes ces collisions possibles, vous pourriez simplement remplacer toutes les occurrences de $delimiter[1] a $delimiter[n] con $delimiter[0] et ensuite se partager le premier ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X