1

まず第一に、私は PHP が得意というわけではありません。基本的な知識しかありませんが、ネストされた div の内容を PHP で操作する方法を探しています。これは、顧客向けのイベントを投稿できるようにする、地元の非営利フードバンクの基本的なサイトです。

たとえば、解析して操作したいファイルには次の構造があります (任意の時点で 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() でいくつか試してみました。私は本当にこの組織を助けたいと思っていますが、目の前のタスクを解決する方法については、上司にアドバイスを求めなければならないところまで来ています.

前もって感謝します。

明確にするために:これは、定期的なメンテナンスのためにDBをホストしたり、サーバーへのftp / sftp / sshアクセスを提供したりすることを許可しないプロバイダーによって外部サービスでホストされているWebサイト用です。計画では、一度サイトを立ち上げ、それ以降は安全でない (現時点では他のオプションはありません) URL を介して維持する予定です。

上記のhtmlを解析し、divタグの多次元配列を作成するためのサンプルphp構文を提供できる人はいますか? 前述したように、私はそれをうまくやり遂げようとしましたが、うまくいきませんでした。何をする必要があるかはわかっていますが、構文で迷ってしまいます。

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 という名前のタグを探しているため、これはうまくいかないことがわかりました。:(

4

2 に答える 2

0

あなたが持っている「php」ファイルを使い続けたい場合(これは不必要に複雑だと思います)、現在のコードが失敗する理由は次のとおりです。

1) DOMDocument の load() メソッドは XML 用に設計されており、適切な形式のファイルを想定しています。これを回避するには、loadHTMLFile() メソッドを使用するか、すべてを親要素にラップします。

2) getElementsByTagName() がタグを探しているため、ループは失敗します。したがって、現在の例では、最も外側のループが 6 つの異なる div を取得します (親イベント、および子の eventTitle と eventContent)。

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 に答える
0

それがsqliteデータベースであろうと単純なテキストファイルであろうと(あなたのニーズには十分と思われる)「データベース」を使用し、phpスクリプトを使用してそのファイルを操作し、必要なhtmlを構築してテキスト/データベースファイルを管理し、コンテンツを表示します.

これは、DOM 操作を使用してイベントを追加/編集/削除するよりもはるかに簡単です。

ところで、私はおそらくスポンサーを探し、まともなホスティング プロバイダーを取得し、実際のデータベースを使用するでしょう...

于 2012-06-29T00:11:40.877 に答える