Php несколько разделителей в разнесении
У меня проблема, у меня есть массив строк, и я хочу разорвать его в другом разделителе. Например
$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;
}
11 answers
Как насчет использования
$output = preg_split( "/ (@|vs) /", $input );
Вы можете взять первую строку, заменить все @
на vs
с помощью str_replace
, затем перейти к vs
или наоборот.
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
Как насчет использования 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!
Просто вы можете использовать следующий код:
$arr=explode('sep1',str_replace(array('sep2','sep3','sep4'),'sep1',$mystring));
У вас возникнут некоторые проблемы (что, если у вас есть эта строка: "vs @яблоки", например) при использовании этого метода разделения, но если мы начнем с того, что вы подумали об этом и исправили все эти возможные столкновения, вы могли бы просто заменить все случаи $delimiter[1]
на $delimiter[n]
с $delimiter[0]
, а затем разделить на этом первом?
Если ваш разделитель состоит только из символов, вы можете использовать strtok
, что, кажется, здесь больше подходит. Обратите внимание, что вы должны использовать его с циклом while
для достижения эффекта.
Я делаю это таким образом...
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);
}
Это будет работать:
$stringToSplit = 'This is my String!' ."\n\r". 'Second Line';
$split = explode (
' ', implode (
' ', explode (
"\n\r", $stringToSplit
)
)
);
Как вы можете видеть, он сначала склеивает разорванные части вместе с пробелом, чтобы затем снова разрезать их на части, на этот раз взяв с собой пробелы.
Вы можете попробовать это решение.... Это отлично работает
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/