【问题标题】:PHP preg_match and regular expressionsPHP preg_match 和正则表达式
【发布时间】:2014-06-28 01:18:53
【问题描述】:

我对 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); 

}

任何帮助提取正确数字将不胜感激

【问题讨论】:

  • 如何在您的 PHP 文件中访问您的数据?它是否保存在变量中?请发布完整的相关代码。
  • 感谢您的回复,我已经添加了我正在开发的全部功能

标签: php regex string


【解决方案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 等。

【讨论】:

    【解决方案2】:

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

    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 有正则表达式教程。

    【讨论】:

    • 感谢您,使用上面的代码时,我收到“(!)警告错误:preg_match():C:\ wamp \ www \ DataConverter1.2中的未知修饰符'\' .php on line 75" ,一定是正则表达式的问题,有没有办法找出原因?
    • 忘记了正则表达式中有文字 / 字符,所以我需要对它们进行转义或在 RE 周围使用不同的分隔符。我已将分隔符更改为#
    猜你喜欢
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 2012-01-14
    相关资源
    最近更新 更多