【问题标题】:Convert html tags to php将html标签转换为php
【发布时间】:2016-04-24 15:02:38
【问题描述】:

我有一个来自合作伙伴的系统状态页面,我正在尝试转换它,以便我可以自动将其输入到我的服务页面中。服务的状态由<span> 类提供。我知道这远非理想,但这是他们提供更新的唯一方式。

以下是 HTML 的副本:

<ul class="item-3">
    <li class="status service1">
        <span class="icon"></span>
        <h6>
        SERVICE 1
        </h6>
        <p>
        Updated:
        9:52 AM CST Apr, 24
        </p>
        <span class="arrow up"></span>
    </li>
    <li class="status service2">
        <span class="icon"></span>
        <h6>
        SERVICE 2
        </h6>
        <p>
        Updated:
        9:52 AM CST Apr, 24
        </p>
        <span class="arrow up"></span>
    </li>
    <li class="status service3">
        <span class="icon"></span>
        <h6>
        SERVICE 3
        </h6>
        <p>
        Updated:
        9:52 AM CST Apr, 24
        </p>
        <span class="arrow up"></span>
    </li>
</ul>

我需要获取&lt;span class="arrow up"&gt; 值,因为这是服务状态,&lt;li class="status service3"&gt; 因为这告诉我它是什么服务。

由于我的状态页面 API 使用 ID 而不是“向上/向下”等,我需要将状态和服务放在数组中,以便我可以将它们转换为我的格式 - 希望这有意义!

【问题讨论】:

    标签: php jquery html dom


    【解决方案1】:

    使用loadHTML方法

    <?php
       $str = '<h1>T1</h1>Lorem ipsum.<h1>T2</h1>The quick red fox...<h1>T3</h1>... jumps over the lazy brown FROG';
       $DOM = new DOMDocument;
       $DOM->loadHTML($str);
    
       //get all H1
       $items = $DOM->getElementsByTagName('h1');
    
       //display all H1 text
       for ($i = 0; $i < $items->length; $i++)
            echo $items->item($i)->nodeValue . "<br/>";
    ?>
    

    输出:

     T1
     T2
     T3
    

    【讨论】:

    • 感谢@Vector,但我需要从现有的 .html 文件中加载它,而不是。此外,您提供的解决方案输出标签的内容,我需要在其中输出标签的类。
    【解决方案2】:

    我不完全确定你想要达到什么目标,但我会做一些假设来澄清我所说的:

    我假设您不会自己生成 HTML,但您想从问题中提供的 HTML 中获取某些元素,从而无法将完整的 HTML 分配给变量。

    span 中两个可能的 将是 "arrow up""arrow down"(事实上,这是两个类,即 "arrow""up"(或“down”)。因此,如果您想获取这些 span 元素的所有实例,您可以简单地执行以下操作:

    $ElementsArray = document.getElementsByClassName("arrow");
    

    这将为您提供一个包含“箭头”类的所有元素的数组,无论它们是否还包含“向上”类或“向下”类。如果您希望只能选择所有“向上”或“向下”,您可以这样做:

    $arrayOfUps = document.getElementsByClassName("up");
    

    假设有更多元素包含类“up”(如“elevator up”“seven up”等。 ) 您还可以使用相同的函数来搜索包含 both 类名的元素,如下所示:

    $arrayOfUps = document.getElementsByClassName("arrow up");
    

    这样可以确保您不会获得包含以下内容的元素:

    class="七上"、class="电梯上"等

    如果您只想获取所有箭头实例的数组(“向上”或“向下”)并遍历每个实例,您当然可以执行以下操作:

    $searchFor = "arrow";
    $results = array();
    $arrCounter=0;
    var $elementsList= document.getElementsByClassName("arrow");
    for ($i=0; i < $elementsList->length; i++) {
       $temp = $elementsList->item($i);
       if (stripos($temp->getAttribute('class'), $searchFor) !== false) {
           $results[$arrCounter] = ( stripos($temp->getAttribute('class'), "up") !== false ) ? "UP" : "DOWN" ;
           $arrCounter++;
       }
    }
    

    列表项也是如此。

    这绝不是优雅的编码,我也会把它变成一个函数,但我只是想建议 PHP DOM 函数用于你建议的目的。

    英语不是我的母语,所以我可能完全错过了你的意思,在这种情况下,我提前道歉。

    【讨论】:

    • 感谢详细的回复!是的,你是对的,我不生成 html 页面,这是通过提供程序完成的,我每隔 X 分钟通过 wget 获取它)。我以前从未使用过 PHP DOM,你能否展示我如何设置它以从我得到的 HTML 文件中加载它?
    • @RedSpider 最简单的方法是使用这个 PHP Simple DOM Parser:simplehtmldom.sourceforge.net 这样就可以使用如下代码: $html = file_get_html('http://www.myhtml.com/');
    • @RedSpider 如果您要扫描的 HTML 文档与您的脚本在同一个域中,您也可以将其加载到 iframe 并使用 innerHTML iframe。但是安全性阻止了在包含来自另一个域的 html 的 iframe 上使用 innerHTML。所以最安全的方法可能是上面提到的 DOM 解析器。
    • 谢谢。我仍然有点困惑(对不起!)。我试图复制您发布的代码,但我收到了unexpected 'var' (T_VAR)
    猜你喜欢
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 2023-04-04
    • 2012-03-08
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多