解析和处理HTML / XML /纯文本页面

时间:2015-02-15 16:11:35

标签: php html regex xml dom

我正在创建一个小型的php应用程序,它可以从远程网站获取数据,但是我希望它能够让用户更友好。

我需要从页面中获取一些特定的项目,据我所知,该页面看起来像一个xml文件,你看看它的代码,但它没有样式,并显示为纯文本所以我不# 39;我真的不知道该怎么做。

我想要的页面看起来像这样

    <channel>
      <name>data</name>
      <id>data</id>
      <img>data</img>
      <auther>data</auther>
      <mp3>data</mp3>
      <bio>data</bio>
   </channel>
    <channel>
      <name>data</name>
      <id>data</id>
      <img>data</img>
      <auther>data</auther>
      <mp3>data</mp3>
      <bio>data</bio>
   </channel>
    <channel>
      <name>data</name>
      <id>data</id>
      <img>data</img>
      <auther>data</auther>
      <mp3>data</mp3>
      <bio>data</bio>
   </channel>
    <channel>
      <name>data</name>
      <id>data</id>
      <img>data</img>
      <auther>data</auther>
      <mp3>data</mp3>
      <bio>data</bio>
   </channel>

我需要从频道标记下的每个标记中获取所有数据并保持相同的顺序,以同样的方式将其回显到我自己的页面上。

我怎么能这样做?我尝试使用带有以下模式的正则表达式

    $pattern = '<channel>
      <name>(.*)</name>
      <id>(.*)</id>
      <img>(.*)</img>
      <auther>(.*)</auther>
      <mp3>(.*)</mp3>
      <bio>(.*)</bio>
   </channel>';

但这不起作用我真的需要最好和最简单的方法来做到这一点。

2 个答案:

答案 0 :(得分:0)

$SimpleXMLElement = new SimpleXMLElement($str);
foreach ($SimpleXMLElement->children() as $Channel) {
    foreach ($Channel->children() as $Child) {
        echo $Child->getName() . ' = ' . (string) $Child;
    }
}

通过这种方式,您可以使用SimpleXMLElement,非常简单

答案 1 :(得分:0)

我会&#34;消毒&#34;传入的数据并从中生成一个xml文档。这可以通过简单地将其包装到周围标签中来完成。 (我将其命名为channels)。有了这个,您可以使用DOM解析数据:

// Sanitize input data. Make an xml out of it
$xml  = '<channels>';
$xml .= file_get_contents($url);
$xml .= '</channels>';

// Create a document
$doc = new DOMDocument();
$doc->loadXML($xml);

// Iterate through channel elements
foreach($doc->getElementsByTagName('channel') as $channel) {
    echo $channel->getElementsByTagName('name')->item(0)->nodeValue . PHP_EOL;
    echo $channel->getElementsByTagName('id')->item(0)->nodeValue . PHP_EOL;
    // And so on ...
}