2012-04-30 142 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 
    ) 

我的問題是該國包括一個我想之前的所有文件夾。我只想'英國'部分,而不是'文件/英國'。所以我需要知道如何匹配除'/'或'\'之外的所有內容。 'c:/ files'可以是配置中預先設置的任何東西,所以我不想在模式中包含該變量或任何其他PHP變量。

我已經看過谷歌和類似的,但我似乎無法找到我正在尋找的答案。

在此先感謝您的幫助。

回答

0

爲避免修改棘手的正則表達式,我建議您保留現有的代碼並使用basename函數。

試試這個:

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

變化的正則表達式:

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

然後,你必須在陣列文件夾成員,您可以使用或以後丟棄。

0

您甘蔗試試這個:

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

工作親愛的..! :)

0

嘗試是更具體的瞭解你做什麼,不想匹配:

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

我假設你永遠要超過一個目錄出現在任何一組,並且該目錄/文件名永遠不會包含除你明確匹配的以外的下劃線或句點。

相關問題