web-dev-qa-db-ja.com

爆発でPHPの複数の区切り文字

私には問題があり、文字列配列があり、別の区切り文字で爆発させたいです。例えば

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

そして、@またはvsで爆発する配列が必要です.

私はすでに解決策を書きましたが、誰もがより良い解決策を持っている場合は、ここに投稿してください。

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;
}
127
OHLÁLÁ

使用はどうですか

 $ output = preg_split( "/(@ | vs)/"、$ input); 
251
SergeS

最初の文字列を取得し、@を使用してすべてのstr_replacevsに置き換えてから、vsで展開するか、その逆を行うことができます。

59
John Ballinger
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 at php.net

38
bizauto

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!

11
Aubry

strtok() は機能しませんか?

10
Mchl

単純に次のコードを使用できます。

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

このソリューションを試すことができます。

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/

3
Mayur Chauhan

このようにしています...

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

これはどう?

/**
 * 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パラメータに配列を使用する必要があります。次に、複数の文字を1つの区切り文字として使用することができます。

結果の末尾のスペースを気にしない場合は、戻り行のarray_map('trim', [...] )部分を削除できます。 (ただし、この場合は口論者にならないでください。preg_splitはそのままにしてください。)

必須PHPバージョン:5.3.0以降。

テストできます here

1
A.F.

この分離方法を使用すると、いくつかの問題が発生します(たとえば、「vs @ apples」という文字列がある場合) $delimiter[1]から$delimiter[n]へのすべての出現を$delimiter[0]に置き換えてから、最初の1つで分割できますか?

1
Nanne

区切り文字が文字のみの場合は、 strtok を使用できます。これは、ここにより適しているようです。効果を得るには、whileループで使用する必要があることに注意してください。

1
Hoàng Long

これは動作します:

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

ご覧のとおり、最初にby\n\rの爆発したパーツをスペースで接着し、次に再び切り離します。今回はスペースを取ります。

0
Xesau