Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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_Date - Fatal编程技术网

PHP将完整日期转换为短日期

PHP将完整日期转换为短日期,php,regex,date,Php,Regex,Date,我需要一个PHP脚本来循环遍历目录中的所有.html文件,并在每个文件中找到长日期的第一个实例(即2014年8月25日),然后以短格式添加带有该日期的标记(即08/25/14日) 以前有人做过这样的事吗?我猜您应该分解字符串,使用复杂的case语句将月份名称和天数转换为常规数字,然后使用/进行内爆 但是我很难找到用于查找第一个长日期的正则表达式 任何帮助或建议都将不胜感激 下面是我在半伪代码中的实现方法 使用漂浮在船上的任何东西循环浏览所有文件(glob()是一个明显的选择) 将HTML文件加载

我需要一个PHP脚本来循环遍历目录中的所有.html文件,并在每个文件中找到长日期的第一个实例(即2014年8月25日),然后以短格式添加带有该日期的标记(即08/25/14日)

以前有人做过这样的事吗?我猜您应该分解字符串,使用复杂的case语句将月份名称和天数转换为常规数字,然后使用
/
进行内爆

但是我很难找到用于查找第一个长日期的正则表达式


任何帮助或建议都将不胜感激

下面是我在半伪代码中的实现方法

  • 使用漂浮在船上的任何东西循环浏览所有文件(
    glob()
    是一个明显的选择)
  • 将HTML文件加载到
    DOMDocument
    ,例如

    $doc = new DOMDocument();
    $doc->loadHTMLFile($filePath);
    
  • 以字符串形式获取正文文本

    $body = $doc->getElementsByTagName('body');
    $bodyText = $body->item(0)->textContent; // assuming there's at least one body tag
    
  • 通过此正则表达式查找日期字符串

    preg_match('/(January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}(st|nd|rd|th)?, \d{4}/', $bodyText, $matches);
    
  • 将其加载到
    DateTime
    对象中,并生成一个短日期字符串

    $dt = DateTime::createFromFormat('F jS, Y', $matches[0]);
    $shortDate = $dt->format('m/d/y');
    
  • 使用
    $shortDate
    文本内容创建一个
    domeElement
    ,将其插入所需的
    DOMDocument
    中,并使用
    $doc->saveHTMLFile($filePath)


  • 我把上面有用的回答融入到我已经拥有的东西中,它似乎起了作用。我相信这离理想还很远,但它仍然符合我的目的。也许这对其他人有帮助:

    <?php
    $dir = "archive";
    $a = scandir($dir);
    
    $a = array_diff($a, array(".", ".."));
    
    foreach ($a as $value) {
    
        echo '</br>File name is: ' . $value . "<br><br>";
    
        $contents = file_get_contents("archive/".$value);
    
        if  (preg_match('/(January|February|March|April|May|June|July|August|September|October|November|December) \d{1,2}(st|nd|rd|th)?, \d{4}/', $contents, $matches)) {
    
            echo 'the date found is: ' . $matches[0] . "<br><br>";
    
            $dt = DateTime::createFromFormat('F jS, Y', $matches[0]);   
            $shortDate = $dt->format('m/d/y');
    
            $dateTag = "\n" . '<p class="date">' . $shortDate . '</p>';
    
            $filename ="archive/".$value;
            $file = fopen($filename, "a+");
    
            fwrite($file, $dateTag);
            fclose($file);
    
            echo 'Date tag added<br><br>';
    
        } else {
    
            echo  "ERROR: No date found<br><br>";
    
        }
    }
    ?>
    
    
    
    代码假定要修改的文件位于名为“archive”的目录中,该目录与脚本位于同一目录中

    需要两个不同的
    preg_match
    行,因为我发现有些日期以序号后缀列出(即2005年8月24日),有些日期不以序号后缀列出(即2005年8月24日)。我不太清楚如何获得一个能同时处理这两个问题的
    preg\u匹配


    编辑:用建议的
    \d{1,2}(st | nd | rd | th)
    将双
    预匹配替换为单匹配。

    这更全面,非常感谢您的回复。第4步和第5步中的preg_匹配和日期格式代码正是我所需要的。如果你展示了你所做的尝试,你可能会收到更少的反对票。感谢你的建议……对于stackoverflow来说,这是一个相对较新的问题,并且没有意识到人们会在不要求澄清或其他细节的情况下惩罚我。无论如何,我感谢你的帮助和建议!只要使用
    \d{1,2}(st|nd|rd|th)?
    啊……就是这样。我用
    ?:
    尝试了所有这些东西
    st |
    之前。我又欠你一次,纠正了我的解决办法。很高兴有像你这样的人。