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