我可以(应该)使用PHP修改HTML页面服务之前,基于类属性值


Can (should) I use PHP to alter HTML page before serving, based on class attribute values

我希望为编码经验有限的内容贡献者提供一种简便的方法,以指定我们网站上现有HTML (PHP)页面上所选内容的到期日期。我更愿意删除服务器端的内容,这样它在源代码中就不可用了。

我正在考虑的潜在解决方案的说明:

<div class="story"> ... </div> 

假设我想让上面的div及其内容从2011年6月1日开始消失。所以我要给class属性添加一个值:

<div class="story disappears-20110601"> ... </div>

然后我必须编写一些代码(xpath?)来定位具有类似="…"模式的类值的所有元素。消失- YYYYMMDD"。如果日期引用是有效的,并且该日期是今天或更早,则代码将从DOM中删除整个div及其内容,然后提供没有过期div的页面。

在我试着设置这个之前,你觉得这个概念怎么样?这可行吗?如果在站点范围内实现,它会成为一个可怕的资源消耗者吗?

更好的方法是将内容存储在数据库表中,并通过DATETIME字段分配过期日期。使用css类来实现这一点是一个小方块。

下面是给你的代码:

<?php
$content = <<<EOF
<div>
some text 1
<div class="story disappears-20110101"> 20110101 </div>
<div class="story disappears-20110601"> 20110601 </div>
some text 2
</div>
EOF;
$doc = new DOMDocument();
$doc->loadHTML($content);
$xpath = new DOMXPath($doc);
$expired = $xpath->query('//*[contains(@class, ''disappears-'')]');
$remove = array();
foreach ($expired as $n)
    if (preg_match('~disappears-('d{4})('d{2})('d{2})~', $n->getAttribute('class'), $m))
        if (time() > mktime(0, 0, 0, $m[2], $m[3], $m[1]))
            $remove[] = $n;
foreach ($remove as $n)
    $n->parentNode->removeChild($n);
echo $doc->saveHTML();

祝你今天愉快。

嗯,您可以使用Regexp来做,但我认为它/可能/(并不意味着它会)变得有点混乱。我建议使用数据库,如果你有访问一个,如果没有存储到单独的文件(在一个目录)的故事,然后加载/删除/编辑他们通过file-name。

在我看来,通过HTML做这件事是不愉快的。

编辑:

<?php
    $html_content = file_get_contents('...');
    preg_match('/class="story disappears-('d*)"/i', $html_content, $match_array)
    foreach($match_array as $val) {
        if (intval($val) < intval(date('Ymd'))) {
            $new_html_content = preg_replace('/(<div class="story disappears-'. $val .'">.*<'/div>)/', '',  $html_content);
            echo $new_html_content;
        }
    }
?>

只是一个旁注,你应该先试着调试这个,我可能做了一些错误,因为我没有使用php一段时间了。但是,如果您偶然发现任何错误,请在评论中告诉我,以便我可以更新代码。

我的意思是必须有一个可用的数据库。即使页面是手工编码的,也可以让它们将每个页面上传到服务器,并让后端创建与上传的页面相关的数据库条目。这个数据库条目可以存储有关上传页面的信息,比如过期日期。

这个XPath 1.0将选择所需的元素:

//*[
   20110601
 >= 
   substring-before(
      substring-after(
         concat(
            ' ',
            normalize-space(@class),
            ' '
         ),
         ' disappears-'
      ),
      ' '
   )
]