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

时间:2014-12-03 02:50:13

标签: php regex date

我需要一个PHP脚本来遍历目录中的所有.html文件,并在每个文件中查找长日期的第一个实例(即August 25th, 2014),然后以短格式添加带有该日期的标记(即<p class="date">08/25/14</p>)。

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

但是我在找出用于查找第一个长日期的正则表达式时遇到了麻烦。

非常感谢任何帮助或建议!

2 个答案:

答案 0 :(得分:1)

以下是我在半伪代码中的表现......

  1. 使用您的船上的任何浮动循环遍历所有文件(glob()是一个明显的选择)
  2. 将HTML文件加载到DOMDocument,例如

    $doc = new DOMDocument();
    $doc->loadHTMLFile($filePath);
    
  3. 将正文文本作为字符串

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

    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);
    
  5. 将其加载到DateTime对象中并生成短日期字符串

    $dt = DateTime::createFromFormat('F jS, Y', $matches[0]);
    $shortDate = $dt->format('m/d/y');
    
  6. 使用<p>文字内容创建DOMElement $shortDate,将其插入您想要的DOMDocument并使用{{1}写回文件}}

答案 1 :(得分:0)

我将上面有用的反应纳入我已经拥有的内容中,似乎有效。我确信它远非理想,但它仍然符合我的目的。也许它可能对其他人有所帮助:

<?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>";

    }
}
?>

代码假定要修改的文件位于名为&#34; archive&#34;的目录中。与脚本位于同一目录中。

需要两个不同的preg_match行,因为我发现一些日期列出了序数后缀(即2005年8月24日),而有些则没有(即2005年8月24日)。无法完全弄清楚如何获得处理这两者的单个preg_match

编辑:根据建议使用preg_match将单\d{1,2}(st|nd|rd|th)?替换为双{{1}}。