2017-11-21 3 views
0

APIからのファイル名の文字列があり、2つの方法で区切られます.1つはカンマで、もう1つはカンマで置き換えられますが、混在しません。preg_splitは特定の条件で分離しない

file name.png, filename2.png, filename3.png, filename4.png 

または

filename.png,filename.png,file name.png,filename.png 

次私がこれまでにファイル名の配列

$fileArray = preg_split('/(\s|,|,)/', $fileList); 
0を作成するには、次のコードを使用しています

しかし、私はファイル名にスペースがある場合、それはそれを切り刻む問題に遭遇します。

ファイル名にスペースを含むファイル名の配列を作成する方法はありますか?

+0

あなたは、文字列にファイル名からスペースを削除することが許可されていますか?もしそうなら、あなたは 'trim()'を使ってカンマをチェックするだけです。それ以外の場合は、かなり複雑な正規表現が必要です。 –

+0

@ObsidianAgeねえ、私は残念ながら – BigJobbies

+0

「その後、コンマスペースでも1」を、文字列の出力を変更することはできませんが、あなたの例では、スペース、それがあるが、カンマを示して?区切り記号は実際にはカンマの後にオプションでスペースを続けますか? – salathe

答えて

4

私はあなたが本当にここに正規表現を必要とは思わない:あなたのコードの後の配列をループしている場合は、array_mapをスキップして、ループ内のファイル名をトリム

$fileNames = explode(',', $fileList); 
$fileArray = array_map('trim', $fileNames); 

。それは繰り返しを節約します。

+0

私はこれを考える理由didntは今ああ...私は私があまりにもpreg_splitの世界に巻き込まれたと思う...そんなに – BigJobbies

+0

@BigJobbiesをありがとうは私たちの最高に起こる:) –

1

はい。

preg_split('/,\\s*/', $list); 

あなたがサポートできる異なるセパレータ::何が欲しいのは、コンマの分離スペースを持つかなしで

preg_split('/[;,]\\s*/', $list); 
+0

なぜあなたは空白文字をエスケープしていますか?存在しないデリミタを含むパターンを書く理由は何ですか? – mickmackusa

+1

空白はPCREには\ sですが、それ自体はエスケープする必要があります。 \ sと\\ sは両方とも不正なエスケープになるので動作しますが、\\ sはより一貫していると感じています。そして、他の人には便利かもしれないので、余分な区切り文字を追加しました。もし私がそうでなければ、別の答えが出てすぐに受け入れられなかった私の答えを削除することもできます。 – LSerni

+0

@LSerni私は自分自身を使ったことがないので、 '\\ s'の使用法を調べなければなりませんでした。同じPCRE構文がスラッシュに適用されます。例えば/ \\\\\/= \、PHPが文字列のスラッシュを読み取る方法のためです。私たちの答えは事実上同じです(複数区切り文字以外)。 '\ s?'はオプションの空白で、 '\ s * 'は0以上の意味です。不正なデータの場合には誤りとみなされる可能性があります。例えば、 '、\ S \ S'技術的に私はリテラル空白文字として' '\ 040'や'//を使用しますが、私はそれがより広く知られている\ 040' 'よりもあるように私の答えに' \のS'を使用し、 '/ /'より読みやすい。 – fyrye

1

正規表現のソリューションを提供するために、あなたがスペースになるだろうがオプションのトークンは?を使用して 次の正規表現はカンマのみ、またはカンマの後ろにスペースを使用し、区切り文字以外の文字列内にスペースを入れることができます。

preg_split('/,\s?/', $string); 

結果:https://3v4l.org/j87Qs

array(5) { 
    [0]=> 
    string(12) "filename.png" 
    [1]=> 
    string(12) "filename.png" 
    [2]=> 
    string(12) "filename.png" 
    [3]=> 
    string(12) "filename.png" 
    [4]=> 
    string(13) "file name.png" 
} 
array(5) { 
    [0]=> 
    string(12) "filename.png" 
    [1]=> 
    string(13) "filename2.png" 
    [2]=> 
    string(13) "filename3.png" 
    [3]=> 
    string(13) "filename4.png" 
    [4]=> 
    string(14) "file name5.png" 
} 
+0

これはまさにこの関数が使用されるものです。 Regexは畳み込みやその他の方法で不必要に複雑なメソッドを書くことを避けるために使用されます。 – mickmackusa

2

区切り文字がある場合:

  1. すべてカンマ区切りまたは
  2. すべてカンマスペース区切りの

することができますただを実行するは、適切な区切り文字を使用して確認し、分解します。これは)何の反復関数がきれい/各要素を変更するために呼び出していないことを意味

array (
    0 => 'filename.png', 
    1 => 'file name2.png', 
    2 => 'filename3.png', 
    3 => 'filename4.png', 
)array (
    0 => 'filename5.png', 
    1 => 'filename6.png', 
    2 => 'file name7.png', 
    3 => 'filename8.png', 
) 

:(Demo

$fileLists=[ 
    'filename.png,file name2.png,filename3.png,filename4.png', 
    'filename5.png, filename6.png, file name7.png, filename8.png' 
]; 
foreach($fileLists as $fileList){ 
    var_export(explode(strpos($fileList,', ')!==false?", ":",",$fileList)); 
} 

出力:2つのテストの実行と

コード。

...正直なところ、これは私のプロジェクトであればpreg_split('/, ?/',$fileList)を使用しています。これは、これが最短で最も洗練されたリテラルメソッドなのでです。

+0

この情報を利用する唯一の回答は、2つの形式のいずれかを使用しています。 – LSerni

+0

'explode( '、'、$ fileNames)'を使わず、代わりに 'trim'を使うのはなぜでしょうか? – Bluetree

+0

@Bluetreeこれは効率が悪いためです。毎回、すべての要素を繰り返し、trim()を呼び出すことになります。 – mickmackusa