我可以(应该)在提供服务之前,根据类属性值使用PHP来修改HTML页面吗

我可以(应该)在提供服务之前,根据类属性值使用PHP来修改HTML页面吗,php,html,xpath,Php,Html,Xpath,我希望有一个简单的方法,让编码经验有限的内容贡献者为我们网站上现有HTML(PHP)页面上的选定内容指定过期日期。我更愿意删除content server端,因此它在源代码中仍然不可用 我正在考虑的一个潜在解决方案的示例: <div class="story"> ... </div> 。。。 假设我希望上面的div及其内容从2011年6月1日起消失。因此,我将向class属性添加一个值: <div class="story disappears-2011060

我希望有一个简单的方法,让编码经验有限的内容贡献者为我们网站上现有HTML(PHP)页面上的选定内容指定过期日期。我更愿意删除content server端,因此它在源代码中仍然不可用

我正在考虑的一个潜在解决方案的示例:

<div class="story"> ... </div> 
。。。
假设我希望上面的div及其内容从2011年6月1日起消失。因此,我将向class属性添加一个值:

<div class="story disappears-20110601"> ... </div>
。。。
然后,我必须编写一些代码(xpath?)来定位所有具有类值的元素,其模式为=“…disapears-
YYYYMMDD
”。如果日期引用有效,并且该日期是今天或更早,那么代码将从DOM中删除整个div及其内容,然后在没有过期div的情况下提供页面


在我尝试建立这个之前,你觉得这个概念怎么样?可行吗?如果在站点范围内实施,这会是一个可怕的资源占用吗?

更好的方法是将内容存储在数据库表中,并通过
日期时间
字段指定过期日期。使用css类来实现这一点是一个小问题。

好吧,您可以使用Regexp来实现这一点,但我认为它/可能/(并不意味着它会)变得有点混乱。我建议如果你有权访问一个数据库,就使用一个数据库,如果你不能将故事存储到单独的文件中(在一个目录中),然后通过文件名加载/删除/编辑它们

在我看来,通过HTML这样做是不愉快的

编辑:

以下是您的代码:

<?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();

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

此XPath 1.0将选择所需的元素:

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

这些故事是来自数据库还是全部是固定的html页面?我的观点是你可能走错了方向。此内容源自何处?RSS源?后端数据库?您应该能够根据可用的内容过滤html的构造,而不是根据不可用的内容破坏html。如果您最终通过html完成,请不要使用attr类。使用
数据消失
。看起来您希望使用HTML模拟数据库。这更多的是XML的用途,而不是真正的HTML。使用真正的XML,您可以使用自己的节点和属性,如
,因为您手头有PHP,所以我不想麻烦使用XML,而是切换到类似CMS的方法和数据库。没有数据库,也没有RSS:(HTML内容是手工编码的,或者我应该说是WYSIWIG'd,由一群技术不太熟练的Dreamweaver用户组成。我发誓我正在推动Drupal。Uphill battle。我会看一看数据消失的文章,谢谢。就像BBieDave建议的那样:如果你有权访问数据库,你应该添加一个DATETIME字段类型。没有可用的数据库。大约有比如说,内容贡献者不是老练的技术人员,但可以打开Dreamweaver并键入内容。一旦我们达到了包含不在WYSIWIG中的正确命名的文件的水平,这对他们来说太难了。最好给自己发送一封电子邮件提醒,删除内容……但我想我可以让他们绞尽脑汁进入代码视图并添加一个类的想法…哦,我通常觉得为我的客户构建CMS比期望他们做任何事情都要简单。相信我,你只会感到失望。:(但你可以使用类似…(编辑答案)LOL的东西“…期望他们做任何事情。”这是我工作的地方,所以用户是同事。我知道他们可以这么做!!也许。好吧,所以我更新了答案,尝试一下代码,它可能会吐出一些错误,我没有调试它,就像它说的那样,但是如果出了问题,我会在评论中告诉我,这样我们就可以修复它(或者你有足够的信心自己修复它)没有可用的数据库。(我发誓,这不是我的错。)我正在努力实现一个开源CMS(问题已经解决),但在我获胜之前,这个网站或多或少都是手工编码的……我喜欢使用这种东西,就像我习惯了jquery选择器一样:然后你可以像$div那样做
foreach(pq(“div[class^=diseases]”){do something}
哦,我更喜欢你的方法而不是我的方法!事实上,我甚至不确定我的方法是否有效……我更喜欢ruby。哈哈哈!但是,不,它是在Dreamweaver中与PHP组合在一起的,包括非技术人员不必接触的部分。嘿,我们对PHP有了批准,所以这是一个加号。谢谢你的代码。我将戴上我的学习帽和pl好的,明天再谈。我非常感激。
//*[
   20110601
 >= 
   substring-before(
      substring-after(
         concat(
            ' ',
            normalize-space(@class),
            ' '
         ),
         ' disappears-'
      ),
      ' '
   )
]