2014-05-10 131 views
1

我是相当新的PHP和正则表达式,我已经走到这一步试图了解如何提取正确的信息读取后,将PHP的preg_match和正则表达式

的样本数据

2011/09/20 00:57  367,044,608 S1E04 - Cancer Man.avi 
2012/03/12 03:01  366,991,496 Family Guy - S09E01 - And Then There Were Fewer.avi 
2012/03/25 00:27  53,560,510 Avatar- The Legend of Korra S01E01.avi 

我会喜欢提取文件的日期,文件大小和名称,记住文件可以基本上以任何东西开始。并且文件大小一直在变化。

我目前有什么。

$dateModifyed = substr($file, 0, 10); 
$fileSize = preg_match('[0-9]*/[0-9]*/[0-9]*/s[0-9]*:[0-9]*/s*', $file, $match) 
$FileName = 

的完整代码我在

function recursivePrint($folder, $subFolders, $Jsoncounter) { 
$f = fopen("file.json", "a"); 

echo '{ "id" : "' . $GLOBALS['Jsoncounter'] . '", parent" : "' . "#" . '", Text" : "' . $folder . '" },' . "\n"; 
$PrintString = '{ "id" : "' . $GLOBALS['Jsoncounter'] . '", parent" : "' . "#" . '", Text" : "' . $folder . '" },' . "\n"; 
fwrite($f, $PrintString); 
$foldercount = $GLOBALS['Jsoncounter']; 
$GLOBALS['Jsoncounter']++; 
foreach($subFolders->files as $file) { 


    preg_match('/^(\d{4}/\d{2}/\d{2}\s+\d{2}:\d{2})\s+([\d,]+)\s+(.*)$/', $file, $match); 
    $dateModified = $match[1]; 
    $fileSize = str_replace(',', '', $match[2]); 
    $fileName = $match[3]; 
    echo $dateModified . $fileSize . $fileName; 


    echo '{ "id" : "' . $GLOBALS['Jsoncounter'] . '", parent" : "' . $foldercount . '", Text" : "' . $file . '" },'; 
    $PrintString ='{ "id" : "' . $GLOBALS['Jsoncounter'] . '", parent" : "' . $foldercount . '", Text" : "' . $file . '" },'; 
    fwrite($f, $PrintString); 
    $GLOBALS['Jsoncounter']++; 
} 

foreach($subFolders->folders as $folder => $subSubFolders) { 
    recursivePrint($folder, $subSubFolders, $Jsoncounter); 
} 
fclose($f); 

}

任何帮助工作提取正确的数字,将不胜感激

+0

您的数据如何在您的PHP文件中访问?它保存在一个变量中吗?请发布完整的相关代码。 – Ejaz

+0

感谢您的回复,我已经添加了我正在工作的全部功能 – user3622769

回答

1

有几个问题在您的正则表达式:

preg_match('[0-9]*/[0-9]*/[0-9]*/s[0-9]*:[0-9]*/s*', $file, $match) 
      ^--missing delimiter^   ^-- asterisk instead of plus 
           |--literal s instead of \s 

,当然你还没有使用过anchorscapturing groups,正则表达式尚未完成。

尝试以下操作:

preg_match_all(
    '%^      # Start of line 
    ([0-9]+/[0-9]+/[0-9]+) # Date (group 1) 
    \s+      # Whitespace 
    ([0-9]+:[0-9]+)   # Time (group 2) 
    \s+      # Whitespace 
    ([0-9,]+)    # File size (group 3) 
    \s+      # Whitespace 
    (.*)     # Rest of the line%mx', 
    $file, $result, PREG_SET_ORDER); 
for ($matchi = 0; $matchi < count($result); $matchi++) { 
    for ($backrefi = 0; $backrefi < count($result[$matchi]); $backrefi++) { 
     # Matched text = $result[$matchi][$backrefi]; 

因此,例如$result[0][1]将包含2011/09/20,并$result[2][4]将包含Avatar- The Legend of Korra S01E01.avi

1

您需要使用捕捉组得到字符串的组成部分:由正则表达式的不同部分匹配。捕获组在正则表达式的部分周围使用括号。

preg_match('#^(\d{4}/\d{2}/\d{2}\s+\d{2}:\d{2})\s+([\d,]+)\s+(.*)$#', $string, $match); 
$dateModified = $match[1]; 
$fileSize = str_replace(',', '', $match[2]); 
$fileName = $match[3]; 

在你的正则表达式的其他问题:

  • 你忽略了在开头和结尾的分隔符。
  • 对于空格字符,您使用了/s而不是\s

有关于正则表达式的教程www.regular-expressions.info

+0

感谢你的使用上面的代码时,我得到一个错误“(!)警告:preg_match():未知修饰符'\'在C: \ wamp \ www \ DataConverter1.2.php on line 75“,在正则表达式中必须是一个问题,有没有一种方法来确定会是什么原因? – user3622769

+0

忘了在正则表达式中有'/'字符,所以我需要在RE中使用不同的分隔符。我已将分隔符更改为'#'。 – Barmar