1

首先,我对 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 的嵌套内容。然而,到目前为止,我所有的尝试都以失败告终。

这样做的重点是允许用户(非技术食品银行管理员)添加、编辑和删除这些结构。我有代码可以添加结构 - 但不确定我将如何在以后重新打开文件,然后编辑和/或删除“事件”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(): Extra content at the end in the document in /var/www/html/events.php, line: 7 in /var/www/html/test.php on line 4

现在看这个,我意识到这永远不会起作用,因为它正在寻找名为 eventTitle 和 eventContent 的标签,而不是类。:(

4

2 回答 2

0

我会使用“数据库”,无论是 sqlite 数据库还是简单的文本文件(似乎足以满足您的需要),并使用 php 脚本来操作该文件并构建所需的 html 来管理文本/数据库文件并显示内容.

这比使用 DOM 操作来添加/编辑/删除事件要容易得多。

顺便说一句,我可能会寻找赞助商,找一个像样的托管服务提供商并使用一个真实的数据库......

于 2012-06-29T00:11:40.877 回答
0

如果您想继续使用您拥有的“php”文件(我认为这不必要的复杂),您当前代码失败的原因是:

1) DOMDocument 的 load() 方法是为 XML 设计的,需要格式良好的文件。解决此问题的方法是使用 loadHTMLFile() 方法,或者将所有内容包装在父元素中。

2)循环失败,因为 getElementsByTagName() 正在寻找标签 - 所以最外面的循环在当前示例中获得 6 个不同的 div(父事件,子事件标题和事件内容)

3) 内部循环当然会失败,因为您再次使用 getElementsByTagName()。请注意,标签名称仍然是 'div';您真正尝试/想要搜索的是“类”属性的值。理论上,您可以通过使用诸如 hasChildNodes() 和/或 getAttribute() 之类的东西放入大量逻辑来解决此问题。

或者,您可以使用有效的 XML 进行重组,而不是您尝试使用的这种奇怪的混合 - 如果您这样做,您可以使用 DOMDocument 写出文件并读取它。除非您想学习如何使用 PHP DOM 库和 XML,否则可能有点矫枉过正。

正如其他人所提到的,我会将 events.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); 
?>

请注意,此代码将整个文件读入内存,因此如果它们有太多事件或超长描述,这可能会变得笨拙,但对于数百甚至数千个事件左右应该可以正常工作。

于 2012-06-29T16:16:13.603 回答