3

これが私が抱えている問題です。ニュースをカテゴリ別に分けようとしています。次のtxtファイルがあります(すべてのニュースをで割ったものが含まれています)。

 <item></item>

これが4つのニュースのセットです。私の実際のファイルには何千ものニュースがあります。

 <item>
 Title: News from Washington
 Author: John Doe
 Category: New Laws
 Body: News content...
 </item>

 <item>
 Title: News from Texas
 Author: General Lee
 Category: Road Accidents
 Body: News content/
 </item>

 <item>
 Title: News from Georgia
 Author: Marcus Smith
 Category: Street Food
 Body: News content
 </item>

 <item>
 Title: News from Illinois
 Author: Robert Simpson
 Category: School Projects
 Body: News content
 </item>

私は次のコーディングをしています:

//I get the content from the news file:
 $news = file_get_contents("news.txt");

//Then I create the following variables to get each set of news from the news variable:
 $regexp = '@<item>(.*?)</item>@msi';

ここからやりたいのは、「屋台の食べ物」だけをカテゴリとして含むニュースのファイルを取得し、カテゴリが異なる他のニュースの残りを却下/無視したい場合です。

例えば

上記の例の結果は、次のアイテムのみを含むファイルになります。

 <item>
 Title: News from Georgia
 Author: Marcus Smith
 Category: Street Food
 Body: News content
 </item>

preg_match_all関数とforeach関数を使用して、運が悪かった特定のカテゴリのニュースのセットを取得しようとしました。

これを達成するために何を提案しますか?または、すばらしい例を教えていただければと思います。

前もって感謝します!

4

2 に答える 2

3

あなたが試すことができます

$final = array();
$filename = "log.txt";
$news = simplexml_load_file($filename);

foreach ( $news as $item ) {
    $item = trim($item);
    $content = array();
    foreach ( explode("\n", $item) as $info ) {
        list($title, $data) = explode(":", $info);
        $content[trim($title)] = $data;
    }
    $final[trim($content['Category'])][] = $content;
}


#Remove Street Food
unset($final['Street Food']);

#Output The Rest 
var_dump($final);

出力

    array
  'New Laws' => 
    array
      0 => 
        array
          'Title' => string ' News from Washington' (length=21)
          'Author' => string ' John Doe' (length=9)
          'Category' => string ' New Laws' (length=9)
          'Body' => string ' News content...' (length=16)
  'Road Accidents' => 
    array
      0 => 
        array
          'Title' => string ' News from Texas' (length=16)
          'Author' => string ' General Lee' (length=12)
          'Category' => string ' Road Accidents' (length=15)
          'Body' => string ' News content/' (length=14)
  'School Projects' => 
    array
      0 => 
        array
          'Title' => string ' News from Illinois' (length=19)
          'Author' => string ' Robert Simpson' (length=15)
          'Category' => string ' School Projects' (length=16)
          'Body' => string ' News content' (length=13)

Rewrite The XML以下を使用することもできます

#Rewrite the array to new XML Fromat
rewriteToXML($final,"log.xml");

これは戻ります

<?xml version="1.0"?>
<items>
    <item>
        <Title> News from Washington</Title>
        <Author> John Doe</Author>
        <Category> New Laws</Category>
        <Body> News content...</Body>
    </item>
    <item>
        <Title> News from Texas</Title>
        <Author> General Lee</Author>
        <Category> Road Accidents</Category>
        <Body> News content/</Body>
    </item>
    <item>
        <Title> News from Illinois</Title>
        <Author> Robert Simpson</Author>
        <Category> School Projects</Category>
        <Body> News content</Body>
    </item>
</items>

新しいフォーマットを読みやすく

$final = array();
$filename = "log.xml";
$news = simplexml_load_file($filename);

foreach ( $news as $item ) {
    #Check if not Street Food
    if(trim($item->Category) != 'Street Food')
            $final[trim($item->Category)][] = (array) $item;
}

#Output The Rest
var_dump($final);

書き換え機能

function rewriteToXML($array, $fileName = null) {
    $xml = new SimpleXMLElement("<items />");
    foreach ( $array as $key => $item ) {
        $child = $xml->addChild("item");
        foreach ( $item as $list ) {
            foreach ( $list as $title => $data ) 
            {
                $child->addChild($title, $data);
            }
        }
    }
    $xml->asXML($fileName);
}
于 2012-10-12T20:29:39.353 に答える
0

これがxmlファイルの場合、正規表現の代わりにsimpleXMLを使用します。次に、xQueryを使用してsimpleXMLドキュメントをクエリできます。

http://php.net/manual/en/book.simplexml.php

于 2012-10-12T20:15:31.343 に答える