Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP预匹配和正则表达式_Php_Regex_String - Fatal编程技术网

PHP预匹配和正则表达式

PHP预匹配和正则表达式,php,regex,string,Php,Regex,String,我对PHP和正则表达式相当陌生,在阅读之后,我一直在努力理解如何提取正确的信息 样本数据 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

我对PHP和正则表达式相当陌生,在阅读之后,我一直在努力理解如何提取正确的信息

样本数据

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); 
}


如果您能帮助提取正确的数字,我们将不胜感激。

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

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
当然,您还没有使用or,正则表达式还没有完成

请尝试以下操作:

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];
preg\u match\u all(
“%^#行首
([0-9]+/[0-9]+/[0-9]+)#日期(第1组)
\s+#空格
([0-9]+:[0-9]+)#时间(第2组)
\s+#空格
([0-9,]+)#文件大小(第3组)
\s+#空格
(*)#行%mx'的其余部分,
$file、$result、PREG\u SET\u ORDER);
对于($matchi=0;$matchi
因此,例如
$result[0][1]
将包含
2011/09/20
,以及
$result[2][4]
将包含
阿凡达-Korra S01E01.avi的传说等。

您需要使用捕获组来获取字符串中与正则表达式不同部分匹配的部分。捕获组在regexp的部分周围使用括号

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];
regexp中的其他问题:

  • 您在开头和结尾省略了分隔符
  • 您对空白字符使用了
    /s
    而不是
    \s

有一个关于正则表达式的教程。

如何在PHP文件中访问您的数据?它是否保存在变量中?请发布完整的相关代码。感谢回复,我已经添加了我正在使用的完整函数,当使用上述代码时,我收到一个错误“(!)警告:preg_match():C:\wamp\www\DataConverter1.2.php第75行中的未知修饰符“\”,必须是正则表达式中的一个问题,是否有方法找出原因?忘记了正则表达式中有文字
/
字符,所以我需要对它们进行转义或在RE周围使用不同的分隔符。我已将分隔符更改为