PHP mehrere Trennzeichen in explodieren


146

Ich habe ein Problem, ich habe ein String-Array und ich möchte in einem anderen Trennzeichen explodieren. Beispielsweise

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

und ich brauche ein Array, das in @ oder vs.

Ich habe bereits eine Lösung geschrieben, aber wenn jeder eine bessere Lösung hat, posten Sie bitte hier.

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

Ich habe nie eine Frage mit Leuten gesehen, die Antworten wie "Wie wäre es damit", "Was ist damit"
gaben

Antworten:


290

was ist mit

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

Tolle. Ich frage mich, wie sich das explode()auf einzelne Argumente
stützt

6
Es spielt keine Rolle, wenn Sie ein großes System mit Hard-String-Parsing erstellen möchten, ist der effektivste Weg der eigene Parser. Im Übrigen hat es keinen großen Einfluss auf die Systemgeschwindigkeit, aber Sie bevorzugen es, den einfachsten Weg für Sie zu verwenden (um Geld effektiv zu sein)
SergeS

9
Beachten Sie, dass einige Zeichen maskiert werden müssen, um zu funktionieren (z. B. /, ?). Zum Beispiel : preg_split("/(\/|\?|=)/", $foo);.
Kenorb

preg_split gibt ein indiziertes Array zurück. Ist es möglich, assoziativ zurückzukehren? Zum Beispiel $str='/x/1/2/3/4/5/y/100/200/z/777'; preg_split("/(x|y|z|)/", $str); und zu sehenarray('x'=>'1/2/3/4/5', 'y'=>'100/200', 'z'=>'777')
LINKeRxUA

2
Ich habe festgestellt, dass die Leerzeichen zwischen / (und ) /preg_split nicht mehr funktionieren. Ich musste die Leerzeichen entfernen und dann funktionierte es wie erwartet (mit PHP 7)
Boardy

69

Sie können die erste Zeichenfolge nehmen, alle @durch vsusing ersetzen str_replaceund dann explodieren vsoder umgekehrt.


1
Einfache Lösung, die letztendlich für Json-Code verwendet wurde, um "}}" durch "|" zu ersetzen. Schmutzig aber effizient :)!
Baldráni

5
Was für ein Genie: D
Deadpool

Dies funktioniert nicht richtig, wenn ein Trennzeichen eine Obermenge des anderen ist (z. B. (@|@!)Fall)

2
@ vaxquis Ja, das wird es. str_replace ('@!', '@', $ str); Stellen Sie sicher, dass Sie mit dem eindeutigsten Trennzeichen beginnen.
John Ballinger

@ JohnBallinger Nein, das wird nicht - Sie haben eine andere Lösung vorgeschlagen , die deutlich zeigt, dass die ursprüngliche Lösung nicht richtig funktioniert und Ihre Idee fehlerhaft ist. Stellen Sie sich vor, Sie wissen nicht, welches die Obermenge eines anderen ist. Sie müssten eine weitere Codezeile erstellen, um dies zu überprüfen usw. Obwohl ich Regexes im Allgemeinen hasse, ist dies ein Fall, wenn es die beste Lösung in Bezug auf Wartbarkeit und Einfachheit ist.

47
function multiexplode ($delimiters,$string) {

    $ready = str_replace($delimiters, $delimiters[0], $string);
    $launch = explode($delimiters[0], $ready);
    return  $launch;
}

$text = "here is a sample: this text, and this will be exploded. this also | this one too :)";


$exploded = multiexplode(array(",",".","|",":"),$text);

print_r($exploded);

//And output will be like this:
// Array
// (
//    [0] => here is a sample
//    [1] =>  this text
//    [2] =>  and this will be exploded
//    [3] =>  this also 
//    [4] =>  this one too 
//    [5] => )
// )

Quelle: php @ metehanarslan bei php.net


14

Wie wäre es strtr(), wenn Sie alle anderen Begrenzer durch die ersten ersetzen würden?

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

Es ist irgendwie unlesbar, denke ich, aber ich habe es als Arbeit hier getestet.

Einzeiler ftw!


11

Würde nicht strtok()für dich arbeiten?


1
Da sein Trennzeichen 'vs' ist, funktioniert dies möglicherweise nicht, wie in php docu angegeben: strtok () teilt eine Zeichenfolge (str) in kleinere Zeichenfolgen (Token) auf, wobei jedes Token durch ein beliebiges Zeichen vom Token getrennt wird. und 'vs' enthält zwei Zeichen
mikewasmike

1
Dies wäre eine bessere Antwort, wenn Sie eine Erklärung oder ein Beispiel hinzufügen würden. wie es ist, ist es eher ein Kommentar ...
billynoah

8

Sie können einfach den folgenden Code verwenden:

$arr=explode('sep1',str_replace(array('sep2','sep3','sep4'),'sep1',$mystring));

4

Sie können diese Lösung ausprobieren ... Sie funktioniert hervorragend

function explodeX( $delimiters, $string )
{
    return explode( chr( 1 ), str_replace( $delimiters, chr( 1 ), $string ) );
}
$list = 'Thing 1&Thing 2,Thing 3|Thing 4';

$exploded = explodeX( array('&', ',', '|' ), $list );

echo '<pre>';
print_r($exploded);
echo '</pre>';

Quelle: http://www.phpdevtips.com/2011/07/exploding-a-string-using-multiple-delimiters-using-php/


einfach und ordentlich
Manojkiran.A

2

Ich mache es so ...

public static function multiExplode($delims, $string, $special = '|||') {

    if (is_array($delims) == false) {
        $delims = array($delims);
    }

    if (empty($delims) == false) {
        foreach ($delims as $d) {
            $string = str_replace($d, $special, $string);
        }
    }

    return explode($special, $string);
}

das ist, wonach ich gesucht habe
Manojkiran.A

2

Wie wäre es damit?

/**
 * Like explode with multiple delimiters. 
 * Default delimiters are: \ | / and ,
 *
 * @param string $string String that thould be converted to an array.
 * @param mixed $delimiters Every single char will be interpreted as an delimiter. If a delimiter with multiple chars is needed, use an Array.
 * @return array. If $string is empty OR not a string, return false
 */
public static function multiExplode($string, $delimiters = '\\|/,') 
{
  $delimiterArray = is_array($delimiters)?$delimiters:str_split($delimiters);
  $newRegex = implode('|', array_map (function($delimiter) {return preg_quote($delimiter, '/');}, $delimiterArray));
  return is_string($string) && !empty($string) ? array_map('trim', preg_split('/('.$newRegex.')/', $string, -1, PREG_SPLIT_NO_EMPTY)) : false;
}

In Ihrem Fall sollten Sie ein Array für den Parameter $ delimiters verwenden. Dann ist es möglich, mehrere Zeichen als ein Trennzeichen zu verwenden.

Wenn Sie sich nicht für nachgestellte Leerzeichen in Ihren Ergebnissen interessieren, können Sie das array_map('trim', [...] )Teil in der Rückgabezeile entfernen . (Aber sei in diesem Fall kein Quibbler. Behalte daspreg_split drin.)

Erforderliche PHP-Version: 5.3.0 oder höher.

Sie können es hier testen


1

Sie werden einige Probleme haben (was ist, wenn Sie diese Zeichenfolge haben: "vs @ apples" zum Beispiel), wenn Sie diese Methode der Trennung verwenden. Wenn wir jedoch zunächst feststellen, dass Sie darüber nachgedacht und alle möglichen Kollisionen behoben haben, Sie könnten einfach alle Vorkommen von $delimiter[1]bis $delimiter[n]durch ersetzen $delimiter[0]und dann das erste aufteilen?


1

Wenn Ihr Trennzeichen nur aus Zeichen besteht, können Sie verwenden strtok, was hier besser zu passen scheint. Beachten Sie, dass Sie es mit einer whileSchleife verwenden müssen, um die Effekte zu erzielen.


0

Das wird funktionieren:

$stringToSplit = 'This is my String!' ."\n\r". 'Second Line';
$split = explode (
  ' ', implode (
    ' ', explode (
      "\n\r", $stringToSplit
    )
  )
);

Wie Sie sehen können, klebt es zuerst die durch \ n \ r explodierten Teile zusammen mit einem Leerzeichen, um es dann wieder auseinander zu schneiden, wobei es diesmal die Leerzeichen mitnimmt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.