Php несколько разделителей в разрыве - PullRequest
125 голосов
/ 10 февраля 2011

У меня проблема, у меня есть строковый массив, и я хочу взорвать его в другом разделителе.Например,

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

, и мне нужен массив, который разбивается на @ или вместо

Я уже написал решение, но если у всех есть лучшее решение, пожалуйста, напишите здесь.

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

Ответы [ 12 ]

248 голосов
/ 10 февраля 2011

как насчет использования

$output = preg_split( "/ (@|vs) /", $input );
59 голосов
/ 10 февраля 2011

Вы можете взять первую строку, заменить все @ на vs, используя str_replace, а затем взорваться на vs или наоборот.

38 голосов
/ 04 января 2015
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] => )
// )

Источник: php @ metehanarslan на php.net

11 голосов
/ 25 октября 2012

Как насчет использования strtr() для замены всех остальных разделителей на первый?

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

Я думаю, это нечитаемо, но я проверил, как работает здесь.

Однострочники ftw!

10 голосов
/ 10 февраля 2011

Не будет ли strtok() работать на вас?

6 голосов
/ 08 марта 2014

Просто вы можете использовать следующий код:

$arr=explode('sep1',str_replace(array('sep2','sep3','sep4'),'sep1',$mystring));
3 голосов
/ 07 июня 2016

Вы можете попробовать это решение .... Это прекрасно работает

<code>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 '
';

Источник: http://www.phpdevtips.com/2011/07/exploding-a-string-using-multiple-delimiters-using-php/

2 голосов
/ 14 октября 2014

Я делаю это так ...

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);
}
1 голос
/ 22 февраля 2019

Как насчет этого?

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

В вашем случае вы должны использовать массив для параметра $ delimiters. Тогда можно использовать несколько символов в качестве одного разделителя.

Если вам не нужны конечные пробелы в ваших результатах, вы можете удалить часть array_map('trim', [...] ) в обратной строке. (Но не будьте обманщиком в этом случае. Оставьте preg_split в нем.)

Требуемая версия PHP: 5.3.0 или выше.

Вы можете проверить это здесь

1 голос
/ 10 февраля 2011

Если в качестве разделителя используются только символы, вы можете использовать strtok, что, по-видимому, больше подходит здесь. Обратите внимание, что вы должны использовать его с циклом while для достижения эффекта.

...