Несколько разделителей в PHP взорваться

146

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

$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;
}
О-ЛЯ-ЛЯ
источник
Я никогда не видел, чтобы люди давали ответы типа «Как насчет этого», «Как насчет этого»
HosseyNJF,

Ответы:

290

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

$ output = preg_split ("/ (@ | vs) /", $ input);
SergeS
источник
Удивительный. Интересно, как это противоречит explode()отдельным аргументам
Ascherer
6
Неважно, если вы хотите создать большую систему с жестким разбором строк, самый эффективный способ - это собственный анализатор. С другой стороны, это не сильно влияет на скорость системы, но вы предпочитаете использовать самый простой способ для вас (чтобы быть эффективными)
SergeS
9
Обратите внимание , что некоторые символы нужно экранировать для работы (например , как /, ?). Например: preg_split("/(\/|\?|=)/", $foo);.
Кенорб
preg_split возвращает индексированный массив. Можно ли вернуть ассоциативный? Например $str='/x/1/2/3/4/5/y/100/200/z/777'; preg_split("/(x|y|z|)/", $str); и посмотретьarray('x'=>'1/2/3/4/5', 'y'=>'100/200', 'z'=>'777')
LINKeRxUA
2
Я обнаружил наличие пробелов между ними / (и ) /остановил работу preg_split. Мне пришлось удалить пробелы, а затем все
заработало
69

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

Джон Баллинджер
источник
1
Простое решение, в конечном итоге использовать его для кода Json, чтобы заменить "}}" на "|". Грязный, но эффективный :)!
Baldráni
5
какой гений: D
Дэдпул
это не будет работать должным образом, когда один разделитель является надмножеством другого (например, (@|@!)case)
2
@vaxquis Да, будет. str_replace ('@!', '@', $ str); Убедитесь, что вы начинаете с самого уникального разделителя.
Джон Баллинджер
@JohnBallinger Нет, не будет - вы предложили другое решение, которое ясно показывает, что оригинальное решение не будет работать должным образом, и что ваша идея ошибочна. Представьте, что вы не знаете, какой из них является надмножеством другого. Вам придется создать еще одну строку кода, чтобы проверить это и т. Д. Хотя я вообще ненавижу регулярные выражения, это тот случай, когда это лучшее решение с точки зрения удобства обслуживания и простоты.
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] => )
// )

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

bizauto
источник
14

Как насчет использования 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)
                )
            )
        )
    );
}

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

Однострочники ФТВ!

Обри
источник
11

Не подойдет strtok()для вас?

MCHL
источник
1
видя, что его разделитель равен «vs», это может не сработать, как говорит php document: strtok () разбивает строку (str) на более мелкие строки (токены), причем каждый токен отделяется любым символом из токена. и «vs» содержит два символа
mikewasmike
1
это был бы лучший ответ, если бы вы включили объяснение или пример. как бы то ни было, это скорее комментарий ...
billynoah
8

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

$arr=explode('sep1',str_replace(array('sep2','sep3','sep4'),'sep1',$mystring));
Самер Ата
источник
4

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

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

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

Майур Чаухан
источник
просто и аккуратно
Manojkiran.A
2

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

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);
}
Вай
источник
это то, что я искал
Manojkiran.A
2

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

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

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

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

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

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

AF
источник
1

У вас возникнут некоторые проблемы (например, если у вас есть эта строка: «vs @ apple») с использованием этого метода разделения, но если мы начнем с заявления, что вы подумали об этом и исправили все возможные конфликты, вы могли бы просто заменить все вхождения $delimiter[1]в $delimiter[n]с $delimiter[0], а затем разделить на этой первой?

Nanne
источник
1

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

Hoàng Long
источник
0

Это будет работать:

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

Как вы можете видеть, он сначала склеивает разорванные части \ n \ r вместе с пробелом, а затем снова разрезает его, на этот раз забирая пробелы с собой.

Xesau
источник