有没有一种简单的方法来获取和操作嵌套的<div>标签与PHP </div>

时间:2012-06-28 22:12:35

标签: php parsing html-parsing getelementbyid getelementsbytagname

首先,我对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访问以进行常规维护。计划是让网站一次到那里,从那时起,通过不安全(此时没有其他选项)维护网站。

任何人都可以提供示例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文档末尾的额外内容,第4行/var/www/html/test.php中第7行

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

2 个答案:

答案 0 :(得分:0)

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

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

顺便说一句,我可能会寻找赞助商,获得一个不错的托管服务提供商并使用真正的数据库......

答案 1 :(得分:0)

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

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

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

3)当你再次使用getElementsByTagName()时,内部循环失败了。请注意,标签名称仍为“div”;你真正想要/想要搜索的是'class'属性的值。理论上,您可以通过使用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); 
?>

请注意,此代码将整个文件读入内存,因此如果它们有太多事件或超长描述,这可能会变得难以处理,但应该可以处理数百甚至数千个事件。