【问题标题】:How to parse HTML/XML with PHP如何使用 PHP 解析 HTML/XML
【发布时间】:2012-04-20 02:43:12
【问题描述】:

从网关我得到一个非常不寻常的结果,它是 XML 中的 HTML,这让我感到困惑。当我回显变量 $result 这是输出:

<Results>
    <XML_Report>
       <Subject>
         <EFX_Code>199</EFX_Code>
         <Referral>SPECIAL_WOHA</Referral>
       </Subject>
    </XML_Report>
<HTML_Report>
<![CDATA[
        <html>
        <head>


        </head>
        <body>



        <a name="mergereport" />

        <p>MERGE REPORT</p>

        <table border="1" WIDTH="100%" cellpadding=0 cellspacing=0>
        <tr><td class=heading colspan=4 align="center" bgcolor="#c0c0c0"><p class=heading>Personal Information Since 08/09/09 FAD 04/17/12</p></td></tr>
        <tr><td><br /></td><td><br /></td><td width="15%" align=center><p><b>Reported</b></p></td><td align=center><p><b>Bur</b></p></td></tr>
        <tr>
        <td width="15%" valign=top align=right><p class=pipad><b>
        Name<br />
        SSN<br />
        Inquiry SSN<br />
        DOB<br />
        Address
        </b></p></td>
        </tr></table>
        </body>

        </html>
]]>
 </HTML_Report>
</Results>

如何解析该变量以仅提取我想要的 HTML 的一部分,例如。任何带有PHP标签的东西......我已经浏览了很多,但如果这样的解析是可能的并且更重要的是如何进行,我找不到任何正确的答案?

【问题讨论】:

标签: php html xml


【解决方案1】:
$doc = new DOMDocument();
$doc->loadHTML($your_html);

然后阅读如何使用DOM library

【讨论】:

    【解决方案2】:

    在理想情况下,XML_Report 将供您的 PHP 之类的脚本读取,而 HTML_Report 仅用于人工显示。但是,从您发布的示例来看,情况似乎并非如此。

    这里有两个解析任务。

    首先,解析 XML。在其中导航(通过 XPath 或 DOM 函数)到 HTML_Report 元素的 CDATA 内容。

    现在,第二个任务:解析 HTML,就像您收到原始字符串一样。

    如果您要问的是“如何使用 PHP 解析 HTML?”这个网站上有大约 18.74 亿个答案。

    【讨论】:

      【解决方案3】:
      $html = substr($xml, strpos($xml, '<html>'), 
                     strpos($xml, '</html>') - strpos($xml, '<html>') + 7);
      

      【讨论】:

        【解决方案4】:

        快速而肮脏的解决方案:

        //Assumes the contents of the xml file are in a string called $xml
        $arr = explode("<HTML_Report>", $xml);
        if(count($arr) > 1)
        {
            $arr2 = explode("</HTML_Report>", $arr[1]);
            $html_portion = $arr2[0];
        }
        

        总结:在 HTML_Report 开始和结束标记处拆分 xml 字符串,每次只保留结果数组中包含 HTML 部分的元素。这将导致 $html_portion 也包含 CDATA 包装器,因此如果您想避免这种情况,请在“”上拆分。

        它并不优雅,但它可以完成工作。

        编辑:从 $xml[1] 到 $arr[1] 的固定代码 - 感谢 Marc B.

        【讨论】:

        • 使用 $xml[1] 将只是整个 xml 文档的第二个字符,因为大概 $xml 只是一个 php 字符串...
        • @MarcB 你是对的 - 错字,应该是 $arr[1] 而不是 $xml[1]
        • @TheOx Guessing,但这可能是因为&lt;HTML_Report&gt; 可能出现在另一个&lt;HTML_Report&gt; 标记的主体中,所以你的代码实际上并不正确......我个人建议使用解析器来解析结构化语言,而不是破解字符串操作。
        • @Borealid - 我明白你在说什么,尽管我的回答是假设 XML 格式与用户发布的内容几乎一致。但你是对的 - 解析器通常是一种更稳定、更灵活的解决方案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-03
        • 1970-01-01
        • 2011-01-09
        • 1970-01-01
        • 2012-02-05
        相关资源
        最近更新 更多