有没有一种简单的方法可以使用 php 获取和操作嵌套的


Is there a simple way to get and manipulate nested <div> tags with php

标签。

首先,我对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); 
?>

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