0

特定の構造を持つファイルのコレクションがあります。

COMPANY_DE-ファイルの実際の内容-RGB-ENG.pdf

壊す:

  • COMPANY -> 会社名、固定
  • DE -> オフィスの場所、固定オプション: '_DE'、'_BE'、または場所に依存しないファイルの場合は存在しない (存在する場合は常にアンダースコアと会社名が前に付く)
  • Actual-Contents-of-File、ダッシュで接着された文字列
  • RGB -> カラーモード、固定オプション: 'RGB'、'CMYK'、'PMS'、または非カラー関連ファイルには存在しない
  • ENG -> ファイルの言語、固定オプション: 'GER'、'ENG'、または非テキスト関連ファイルの場合は省略
  • pdf -> 拡張子、何でもかまいません

最良の場合、私の結果は名前付きキーを持つ上記の情報を含む配列になりますが、どこから始めればよいかわかりません。

助けていただければ幸いです。

ありがとう、クナル


不明確で申し訳ありませんが、いくつかの変数がファイル名に常に存在するとは限りません: - DE -> 固定オプション: '_DE'、'_BE'、または不在 - RGB -> カラーモード、固定オプション: 'RGB'、' CMYK'、'PMS'、またはなし - ENG -> ファイルの言語、固定オプション: 'GER'、'ENG'、またはなし

4

5 に答える 5

1

可能な限り正規表現を使用しないようにするか、可能な限り単純にしてください。

$text = "COMPANY_DE-Actual-Contents-of-File-RGB-ENG.pdf";
$options_location = array('DE','BE');
$options_color = array('RGB','CMYK','PMS');
$options_language = array('ENG','GER');

//Does it have multiple such lines? In that case this:
$lines = explode("\n",$text);
//Then loop over this with a foreach, doing the following for each line:

$parts = preg_split('/[-_\.]/', $line);
$data = array(); //result array
$data['company'] = array_shift($parts); //The first element is always the company
$data['filetype'] = array_pop($parts); //The last bit is always the file type
foreach($parts as $part) { //we'll have to test each of the remaining ones for what it is
    if(in_array($part,$options_location))
        $data['location'] = $part;
    elseif(in_array($part,$options_color))
        $data['color'] = $part;
    elseif(in_array($part,$options_language))
        $data['lang'] = $part;
    else
        $data['content'] = isset($data['content']) ? $data['content'].' '.$part : $part; //Wasn't any of the others so attach it to the content
}

これは、正規表現が正確に何をしているのかを理解する必要がなく、理解するのも簡単です。

これは、コンテンツのどの部分も、場所、色、または言語のために予約されている単語の 1 つにならないことを前提としていることに注意してください。これらがコンテンツ内で発生する可能性がある場合は、isset($data['location'])別の場所が既に見つかっているかどうかを確認し、見つかった場合は場所として保存するのではなく、正しい場所をコンテンツに追加するなどの条件を追加する必要があります。

于 2012-04-19T08:41:54.533 に答える
1

試す

$string = "COMPANY_DE-Actual-Contents-of-File-RGB-ENG.pdf";
$array = preg_split('/[-_\.]/', $string);

$len = count($array);
$struct = array($array[0], $array[1], '', $array[$len-3], $array[$len-2], $array[$len-1]);
unset($array[0], $array[1], $array[$len-3], $array[$len-2], $array[$len-1]);
$struct[2] = implode('-', $array);
var_dump($struct);

-

array
  0 => string 'COMPANY' (length=7)
  1 => string 'DE' (length=2)
  2 => string 'Actual-Contents-of-File' (length=23)
  3 => string 'RGB' (length=3)
  4 => string 'ENG' (length=3)
  5 => string 'pdf' (length=3)
于 2012-04-19T08:17:47.240 に答える
0

どうですか:

$files = array(
    'COMPANY_DE-Actual-Contents-of-File-RGB-ENG.pdf',
    'COMPANY_BE-Actual-Contents-of-File-CMYK-ENG.pdf',
    'COMPANY_DE-Actual-Contents-of-File-PMS-GER.doc',
    'COMPANY-Actual-Contents-of-File-PMS-GER.doc',
    'COMPANY-Actual-Contents-of-File-GER.doc',
    'COMPANY-Actual-Contents-of-File.doc',
);

foreach($files as $file) {
    preg_match('/^(?<COMPANY>.*?)_?(?<LOCATION>DE|BE)?-(?<CONTENT>.*?)-?(?<COLOR>RGB|CMYK|PMS)?-?(?<LANG>ENG|GER)?\.(?<EXT>[^.]+)$/', $file, $m);
    echo "\nfile=$file\n";
    echo "COMPANY: ",$m['COMPANY'],"\n";
    echo "LOCATION: ",$m['LOCATION'],"\n";
    echo "CONTENT: ",$m['CONTENT'],"\n";
    echo "COLOR: ",$m['COLOR'],"\n";
    echo "LANG: ",$m['LANG'],"\n";
    echo "EXT: ",$m['EXT'],"\n";
}

出力:

file=COMPANY_DE-Actual-Contents-of-File-RGB-ENG.pdf
COMPANY: COMPANY
LOCATION: DE
CONTENT: Actual-Contents-of-File
COLOR: RGB
LANG: ENG
EXT: pdf

file=COMPANY_BE-Actual-Contents-of-File-CMYK-ENG.pdf
COMPANY: COMPANY
LOCATION: BE
CONTENT: Actual-Contents-of-File
COLOR: CMYK
LANG: ENG
EXT: pdf

file=COMPANY_DE-Actual-Contents-of-File-PMS-GER.doc
COMPANY: COMPANY
LOCATION: DE
CONTENT: Actual-Contents-of-File
COLOR: PMS
LANG: GER
EXT: doc

file=COMPANY-Actual-Contents-of-File-PMS-GER.doc
COMPANY: COMPANY
LOCATION:
CONTENT: Actual-Contents-of-File
COLOR: PMS
LANG: GER
EXT: doc

file=COMPANY-Actual-Contents-of-File-GER.doc
COMPANY: COMPANY
LOCATION:
CONTENT: Actual-Contents-of-File
COLOR:
LANG: GER
EXT: doc

file=COMPANY-Actual-Contents-of-File.doc
COMPANY: COMPANY
LOCATION:
CONTENT: Actual-Contents-of-File
COLOR:
LANG:
EXT: doc
于 2012-04-19T12:04:02.180 に答える
0

@Armatus に触発されて、フェイルセーフと思われる次のものを作成しました。

$string = "COMPANY_DE-Actual-Contents+of-File-RGB-ENG.pdf";
$options_location = array('DE','BE');
$options_color = array('RGB','CMYK','PMS');
$options_language = array('ENG','GER');
$parts = preg_split( '/[\.\-\_]/', $string, NULL, PREG_SPLIT_NO_EMPTY );

$data = array();
$data['company'] = array_shift($parts);
$data['filetype'] = array_pop($parts);

if( in_array( $parts[0], $options_location ) ){
$data['location'] = array_shift($parts);
}else{
$data['location'] = NULL;
};

if( in_array( end( $parts), $options_language ) ){
$data['language'] = array_pop($parts);
}else{
$data['language'] = NULL;
};

if( in_array( end( $parts), $options_color ) ){
$data['colormode'] = array_pop($parts);
}else{
$data['colormode'] = NULL;
};

$data['content'] = implode( ' ', $parts );
print_r( $data );
于 2012-04-20T06:39:52.287 に答える
0

そんな感じ:

preg_match('#^([^_]+)(_[^-]+)?-([\w-]+)-(\w+)-(\w+)(\.\w+)$#i', 'COMPANY_DE-Actual-Contents-of-File-RGB-ENG.pdf', $m);

preg_match('#^([^_]+)(_[^-]+)?-([\w-]+)-(\w+)[_-]([^_]+)(\.\w+)$#i', 'COMPANY_DE-Actual-Contents-of-File-RGB-ENG.pdf', $m); // for both '_' and '-'

preg_match('#^(\p{Lu}+)(-\p{Lu}+)?-([\w]+)(\-(\p{Lu}+))?(\-(\p{Lu}+))?(\.\w+)$#', 'COMPANY-NL-Actual_Contents_of_File-RGB-ENG.pdf', $m); // if filename parts divider is strictly '-'

var_dump($m);

最後のバリアントでは、国コード (-NL) がない場合は NULL になります。しかし、色と言語コードではそうではありません。自分で試してみると、それがどのように機能するかがわかります!

于 2012-04-19T08:14:02.527 に答える