【问题标题】:How do I strip data from HTML tags [duplicate]如何从 HTML 标签中删除数据 [重复]
【发布时间】:2010-11-10 03:39:08
【问题描述】:

假设我有这样的数据:

<option value="abc" >Test - 123</option>
<option value="def" >Test - 456</option>
<option value="ghi" >Test - 789</option>

使用 PHP,我将如何对 HTML 标记进行排序,从选项值中返回所有文本。例如,给定上面的代码,我想返回 'Test - 123'、'Test - 456'、'Test - 789'。

感谢您的帮助!

更新: 这样我就更清楚了-我正在使用 filegetcontents() 从站点获取 html。出于我的目的,我希望能够对 html 进行排序,找到选项值并输出它们。在这种情况下,返回 'Test - 123'、'Test - 456' 等。

【问题讨论】:

    标签: php html regex


    【解决方案1】:

    除非我误解了问题,否则使用strip_tags

        $string = '<option value="abc" >Test - 123</option>
        <option value="def" >Test - 456</option>
        <option value="ghi" >Test - 789</option>';
    
        $string = strip_tags($string);
    

    更新:错过了您在问题中松散地指定了一个数组。在这种情况下,我确信有一种更清洁的方法,我会这样做:

    $teststring = '<option value="abc" >Test - 123</option>
    <option value="def" >Test - 456</option>
    <option value="ghi" >Test - 789</option>';
    
    $stringarray = split("\n", strip_tags($teststring));
    print_r($stringarray);
    

    更新 2: 只是为了顶部和尾部,按照您最初的要求呈现它(不是我们可能被误导相信的数组,请尝试以下操作:

    $teststring = '<option value="abc" >Test - 123</option>
    <option value="def" >Test - 456</option>
    <option value="ghi" >Test - 789</option>';
    
    $stringarray = split("\n", strip_tags($teststring));
    
    $newstring = join($stringarray, "','");
    echo "'" . $newstring . "'\n";
    

    【讨论】:

      【解决方案2】:

      如果我们在做正则表达式,我喜欢这种类似 perl 的语法:

      $test = "<option value=\"abc\" >Test - 123</option>\n" .
          "<option value=\"abc\" >Test - 456</option>\n" .
          "<option value=\"abc\" >Test - 789</option>\n"; 
      
      for ($offset=0; preg_match("/<option[^>]*>([^<]+)/",$test, $matches, 
                              PREG_OFFSET_CAPTURE, $offset); $offset=$matches[1][1])
         print($matches[1][0] . "\n");'
      

      【讨论】:

      • 选项元素的值属性定义为 CDATA。如果我没记错的话,在 html 4.01 中允许
      • 是的,确实如此 :-) 使用正则表达式很容易编写一些简单的东西来处理常见的用例(以及东方阅读),但是很难编写一些解析结构化语言的东西,例如XML 正确。如果您需要严格的“处理您扔给它的任何东西”解析器,请使用能够理解语言的东西,例如 DOM 或 SAX。缺点是对于简单的情况 DOM 和 SAX 更难编写和更难阅读。
      【解决方案3】:

      http://networking.ringofsaturn.com/Web/removetags.php

      preg_match_all("s/<[a-zA-Z\/][^>]*>//g", $data, $out);
      

      【讨论】:

      • 这可能是 sed 的有效模式,但不是 php 的 preg_match_all。
      【解决方案4】:

      如果您不只是像上面提到的那样出现断裂,请使用像 DOMDocument 这样的真正解析器,您可以使用 DOMXPath 来遍历它。

      否则试试这个正则表达式和preg_match_all:

      <option(?:[^>"']+|"[^"]*"|'[^']*')*>([^<]+)</option>
      

      【讨论】:

        【解决方案5】:

        有很多方法,哪种方法最好取决于您在问题中提供的详细信息。
        一种可能:DOMDocument and DOMXPath

        <?php
        $doc = new DOMDocument;
        $doc->loadhtml('<html><head><title>???</title></head><body>
          <form method="post" action="?" id="form1">
              <div>
                <select name="foo">
                <option value="abc" >Test - 123</option>
                <option value="def" >Test - 456</option>
                <option value="ghi" >Test - 789</option>
              </select>
            </div>
          </form>
        </body></html>');
        
        $xpath = new DOMXPath($doc);
        foreach( $xpath->query('//form[@id="form1"]//option') as $o) {
            echo 'option text: ', $o->nodeValue, "  \n";
        }
        

        打印

        option text: Test - 123  
        option text: Test - 456  
        option text: Test - 789  
        

        【讨论】:

          【解决方案6】:

          此代码会将值加载到数组中,假设您在选项标签之间有换行符,就像您展示的那样:

          // Load your HTML into a string.
          $html = <<<EOF
          <option value="abc" >Test - 123</option>
          <option value="def" >Test - 456</option>
          <option value="ghi" >Test - 789</option>
          EOF;
          
          // Break the values into an array.
          $vals = explode("\n", strip_tags($html));
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-12-06
            • 2012-12-29
            • 2011-09-04
            • 2019-05-01
            • 2010-12-14
            • 1970-01-01
            • 2013-04-28
            • 2014-11-26
            相关资源
            最近更新 更多