解析和处理 HTML/XML/纯文本页面 [重复]

Posted

技术标签:

【中文标题】解析和处理 HTML/XML/纯文本页面 [重复]【英文标题】:parse and process HTML/XML/plain text page [duplicate] 【发布时间】:2015-04-16 04:14:52 【问题描述】:

我正在创建一个小型 php 应用程序,它可以从远程网站提取数据,它工作得很好,但我想让它现在对用户更友好。

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

我想要的页面是这样的

    <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>';

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

【问题讨论】:

也许SimpleXMLElement 会是从中获取数据的更好方法? 你的意思是像 $xml = simplexml_load_string($input); $callback = $xml->"name";但是我将如何获取每个通道下的所有值并保持它们相同以再次回显,因为我认为只是让它们像这样可能会将其他渠道的东西混在一起吗? 【参考方案1】:
$SimpleXMLElement = new SimpleXMLElement($str);
foreach ($SimpleXMLElement->children() as $Channel) 
    foreach ($Channel->children() as $Child) 
        echo $Child->getName() . ' = ' . (string) $Child;
    

这样你就可以使用SimpleXMLElement了,很简单

【讨论】:

我需要能够逐个获取频道标签下的每个标签并回显它们或编码它们我不知道如何使用这种方法来完成,因为我不知道女巫是女巫 【参考方案2】:

我会“清理”传入的数据并从中制作一个 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 ...

【讨论】:

这种方式看起来既简单又好,如果我需要编辑它,我现在就试试 这不起作用,它将 添加到新行的底部,但将第一个 标签添加到与 相同的行并显示为红色 什么???对不起,我没听懂。 它在清理创建 xml 文件后没有放置空格 我用 PHP_EOL 修复了它可以很好地创建文件,如果我回显它,它工作得很好,我可以看到所有东西,但是我试着得到这些位我需要从每个频道中得到一个空白页 我已经用您发布的输入数据对其进行了测试——它有效

以上是关于解析和处理 HTML/XML/纯文本页面 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

将 HTML 代码转换为纯文本,格式可用于文本文件 [重复]

Thymeleaf相关补充

XXE漏洞详解

thymeleaf学习

当内容类型为文本/纯文本时,.NET Core 1.0 Web Api 将请求正文处理为 JSON

使用 PHP 从纯文本和 HTML 文本的混合创建 PDF [重复]