首先,我对PHP远非很好 - 对它只有基本的熟悉,但我正在寻找一种使用php操作嵌套div内容的方法。 这是当地非营利食品银行的基本网站,允许他们为客户发布活动。
例如,我要解析和使用的文件具有以下结构(尽管在任何时间点都可能有 2 个以上的条目,但将此视为完整文件):
<div class="event">
<div class="eventTitle">title text</div>
<div class="eventContent">event content</div>
</div>
<div class="event">
<div class="eventTitle">title2</div>
<div class="eventContent">event content2</div>
</div>
我的想法是解析它(最好的方法是什么?),并使用class="event"构建所有div的多维数组,以及每个数组的嵌套内容。 然而,到目前为止,我所有的尝试都以失败告终。
这样做的目的是允许用户(非技术食品银行管理员)添加、编辑和删除这些结构。 我有代码来添加结构 - 但不确定以后如何重新打开文件,然后编辑和/或删除"事件"div 及其嵌套内容的选定实例。 这似乎应该是一件容易的事,但我只是无法理解我在网上找到的搜索结果。
我已经尝试了一些preg_match(),getElementById()和getElementByTagName()的东西。 我真的很想帮助这个组织,但我必须听从我的上级关于如何解决手头任务的建议。
提前谢谢。
澄清一下:这是针对他们的网站,由提供商托管在外部服务上,该提供商不允许他们托管数据库或提供对服务器的 ftp/sftp/ssh 访问以进行定期维护。 计划是将站点启动一次,然后通过不安全(此时没有其他选项)URL对其进行维护。
任何人都可以提供一个示例 php 语法来解析上面的 html 并创建div 标签的多维数组吗?正如我所提到的,我曾试图通过它,但没有成功。 我知道我需要做什么,我只是迷失在语法中。
IE:这就是我想出的,但它似乎不起作用,而且我对 php 的理解不够深刻,无法确切理解为什么它不起作用。
<?php
$doc = new DOMDocument();
$doc->load('events.php');
$events = array();
foreach ($doc->getElementsByTagName('div') as $node) {
// looks at each <div> tag and creates an array from the other named tags below // hopefully...
$edetails = array (
'title' => $node->getElementsByTagName('eventTitle')->item(0)->nodeValue,
'desc' => $node->getElementsByTagName('eventContent')->item(0)->nodeValue
);
array_push($events, $edetails);
}
foreach ($events as &$edetails) {
// walk through the $events array and write out the appropriate information.
echo $edetails['title'] . "<br>";
echo $edetails['desc'] . "<br>";
}
print_r($events); // this is currently empty and not being populated
?>
错误:PHP 警告:DOMDocument::load():文档末尾的额外内容在/var/www/html/events.php,第 7 行在/var/www/html/test.php 第 4 行
现在看看这个,我意识到这永远行不通,因为它正在寻找名为 eventTitle 和 eventContent 的标签,而不是类。 :(
我会使用"数据库",无论是sqlite数据库还是简单的文本文件(似乎足以满足您的需求),并使用php脚本来操作该文件并构建所需的html来管理文本/数据库文件并显示内容。
这比使用 DOM 操作添加/编辑/删除事件要容易得多。
顺便说一句,我可能会寻找赞助商,获得一个体面的托管服务提供商并使用真正的数据库......
如果你想继续使用你拥有的"php"文件(我认为这是不必要的复杂),你当前代码失败的原因是:
1) DOMDocument 的 load() 方法是为 XML 设计的,并且需要一个格式正确的文件。 解决方法是使用 loadHTMLFile() 方法,或者将所有内容包装在父元素中。
2)循环失败,因为getElementsByTagName()正在寻找标签 - 所以最外面的循环在当前示例中获得6个不同的div(父事件,以及子事件标题和事件内容)
3)内部循环当然失败了,因为你再次使用getElementsByTagName()。请注意,标签名称仍然是"div";您真正尝试/想要搜索的是"类"属性的值。 从理论上讲,你可以通过使用hasChildNodes()和/或getAttribute()之类的东西输入大量逻辑来解决这个问题。
或者,您可以使用有效的XML进行重组,而不是您尝试使用的这种奇怪的混合体 - 如果您这样做,则可以使用DOMDocument写出文件并读取它。 可能矫枉过正,除非你想学习如何使用PHP DOM库和XML。
正如其他人所提到的,我会将事件的格式更改为.php除了一堆div 之外的东西。 由于数据库不是一种选择,我可能会选择管道分隔文件,例如:
title text|event content
title2|event content2
解析它的代码会简单得多,大致如下:
<?php
$events = array();
$filename = 'events.txt';
if (file_exists($filename)) {
$lines = file($filename);
foreach ($lines as $line) {
list($title, $desc) = explode('|', $line);
$event = array('title'=>$title, 'desc'=>$desc);
$events[] = $event; //better way of adding one element to an array than array_push (http://php.net/manual/en/function.array-push.php)
}
}
print_r($events);
?>
请注意,此代码将整个文件读入内存,因此,如果它们有太多事件或超长描述,这可能会变得笨拙,但应该适用于数百甚至数千个左右的事件。