2012-04-30 7 views
0

データベースに挿入する完全なファイルパスと名前のセグメントを抽出できる必要があります。これを行うために私はPHPでpreg_matchを使用しています。私はまた、マッチの配列が連想的なものになるように、パターン内から各セグメントに名前を与えています。PHP preg_match:文字列以外のすべてにマッチする

$subject = 'c:/files/uk/kent/ashford/12345_Joe_Blogs_20120202120000.pdf'; 
    $pattern = '/[\/\\\\](?<country>.*)[\/\\\\](?<county>.*)[\/\\\\](?<town>.*)[\/\\\\](?<id>.*)_(?<first_name>.*)_(?<last_name>.*)_(?<datetime>.*)\.(?<file_extension>pdf)/'; 
    preg_match($pattern, $subject, $matches); 
    foreach($matches as $key => $match) 
    { 
     if(is_numeric($key)) 
      unset($matches[$key]); 
    } 
    print_r($matches); 

作成します:

Array 
    (
     [country] => files/uk 
     [county] => kent 
     [town] => ashford 
     [id] => 12345 
     [first_name] => Joe 
     [last_name] => Blogs 
     [datetime] => 20120202120000 
     [file_extension] => pdf 
    ) 

私の問題は、その国である私が欲しいものを、先行するすべてのフォルダが含まれてここでの例です。私は 'uk'の部分だけを必要とし、 'files/uk'は望んでいない。だから私は '/'または '\'以外のすべてのものにマッチする方法を知る必要があります。 'c:/ files'は構成内にあらかじめ設定されているものなので、パターンにその変数やその他のPHP変数を含めたくない場合があります。

Googleなどでこれを調べましたが、私が探している回答が見つからないようです。

ご協力いただきありがとうございます。

答えて

0

トリッキーなRegexを修正する必要がないように、既存のコードをそのまま使用し、basename機能を使用することをおすすめします。

これを試してみてください:

echo basename($matches['country']); 
//outputs "uk" 
0

変更正規表現へ:

$pattern = '/[\/\\\\](?<folder>.*)[\/\\\\](?<country>.*)[\/\\\\](?<county>.*)[\/\\\\](?<town>.*)[\/\\\\](?<id>.*)_(?<first_name>.*)_(?<last_name>.*)_(?<datetime>.*)\.(?<file_extension>pdf)/'; 

は、その後、あなたが使用したり、後で破棄することができ、アレイ内のフォルダ メンバーを、持っています。

$pattern = '/[\/\\\\](.*)[\/\\\\](?<country>.*)[\/\\\\](?<county>.*)[\/\\\\](?<town>.*)[\/\\\\](?<id>.*)_(?<first_name>.*)_(?<last_name>.*)_(?<datetime>.*)\.(?<file_extension>pdf)/'; 

その作業の親愛なる..:

0

あなた杖はこれを試してみてください! :)

0

ことはあなたは何をすべきかについて、より具体的なこと試してみて、一致したくない:

'%(?x) 
[/\\\\](?P<country>[^_./\\\\]+) 
[/\\\\](?P<county>[^_./\\\\]+) 
[/\\\\](?P<town>[^_/\\\\]+) 
[/\\\\](?P<id>[^_./\\\\]+) 
_(?P<first_name>[^_./\\\\]+) 
_(?P<last_name>[^_./\\\\]+) 
_(?P<datetime>[^_./\\\\]+) 
\.(?P<file_extension>pdf) 
%' 

私はあなたが任意のグループに表示されるように複数のディレクトリをたくないと仮定すると、ディレクトリということです/ファイル名には、明示的に一致するもの以外のアンダースコアやピリオドは含まれません。

関連する問題