PHPの複数の区切り文字を分解する


146

問題があります。文字列配列があり、別の区切り文字で分解したいと思います。例えば

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

「これはどうだ」、「それはどうだ」などの回答をする人からの質問を見たことがありません
HosseyNJF

回答:


290

使用についてはどうですか

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

すごい。これexplode()が単一の議論にどう反論するのか疑問に思います
Ascherer '21

6
ハード文字列解析を使用して大規模なシステムを作成する場合は、最も効果的な方法は独自のパーサーです。それ以外の場合は、システム速度にはあまり影響しませんが、最も簡単な方法を使用することをお勧めします(費用対効果を
高める

9
注一部の文字という(のような仕事にエスケープする必要があり/?)。例:preg_split("/(\/|\?|=)/", $foo);
kenorb 2015

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が機能しなくなりました。スペースを削除する必要があり、それは期待どおりに機能しました(PHP 7を使用)
Boardy

69

最初の文字列を取り、@vs使用してすべてを置き換えstr_replace、次に分解するvsか、またはその逆を行うことができます。


1
簡単な解決策、Jsonコードで「}}」を「|」に置き換えるために使用することになりました。汚いが効率的:)!
Baldráni

5
なんという天才:D
デッドプール

1つの区切り文字が他の区切り文字のスーパーセットである(@|@!)場合(例:ケース)、これは適切に機能しません

2
@vaxquisはい、そうです。str_replace( '@!'、 '@'、$ str); 最もユニークな区切り文字から始めてください。
ジョンバリンジャー2018

@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.netのphp @ metehanarslan


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

それはちょっと判読不能だと思いますが、ここで動作するようにテストしました。

ワンライナーFTW!


11

うまくstrtok()いきませんか?


1
彼の区切り文字が「vs」であることを確認すると、php docuが言うようにこれは機能しない可能性があります。strtok()は文字列(str)を小さな文字列(トークン)に分割し、各トークンはトークンの任意の文字で区切られます。「vs」には2つの文字が含まれています
mikewasmike

1
説明や例を含めれば、これはより良い答えです。
現状

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

あなたのケースでは、$ delimitersパラメータに配列を使用する必要があります。次に、複数の文字を1つの区切り文字として使用できます。

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

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

ここでテストできます


1

この分離方法を使用すると、いくつかの問題が発生します(たとえば、この文字列: "vs @ apples"がある場合)。しかし、それについて考え、すべての競合の可能性を修正したことから始めると、あなただけのすべての出現箇所を置き換えることができます$delimiter[1]$delimiter[n]して$delimiter[0]、その後、その最初の1に分割しますか?


1

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


0

これは動作します:

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

ご覧のとおり、最初に\ n \ r分解されたパーツをスペースで接着し、次に再び切り離します。今度はスペースを一緒に取ります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.