【问题标题】:Get text contained within a specific html element using php使用 php 获取包含在特定 html 元素中的文本
【发布时间】:2012-09-16 08:48:47
【问题描述】:

我需要获取特定 div 之间包含的所有文本。在下面的示例中,我想获取类名为“st”的 div 之间的所有内容:

<div class="title">This is a title</div>
<div class="st">Some example <em>text</em> here.</div>
<div class="footer">Footer text</div>

所以结果是

Some example <em>text</em> here.

甚至只是

Some example text here.

有谁知道如何做到这一点?

【问题讨论】:

标签: php regex parsing


【解决方案1】:

PHP 中的服务器端

一个非常基本的方法是这样的:

$data = ''; // your HTML data from the question
preg_match( '/<div class="\st\">(.*?)<\/div>/', $data, $match );

然后迭代$match 对象。但是,如果您的 .st DIV 中包含另一个 DIV,这可能会返回错误数据。

更合适的方法是:

function getData()
{
    $dom = new DOMDocument;
    $dom -> loadHTML( $data );
    $divs = $dom -> getElementsByTagName('div');

    foreach ( $divs as $div )
    {
        if ( $div -> hasAttribute('class') && strpos( $div -> getAttribute('class'), 'st' ) !== false )
        {
            return $div -> nodeValue;
        }
    }
}

客户端

如果你使用的是jQuery,那么就很简单了:

$('.st').text();

$('.st').html();

如果您使用纯 JavaScript,这会有点复杂,因为您必须检查所有 DIV 元素,直到找到具有所需 CSS 类的元素:

function foo()
{
    var divs = document.getElementsByTagName('div'), i;

    for (i in divs)
    {
        if (divs[i].className.indexOf('st') > -1)
        {
            return divs[i].innerHTML;
        }
    }
}

【讨论】:

    【解决方案2】:

    使用DOM。示例:

    $html_str = "<html><body><div class='st'>Some example <em>text</em> here.</div></body></html>";
    $dom = new DOMDocument('1.0', 'iso-8859-1');
    
    $dom->loadHTML($html_str); // just one method of loading html.
    $dom->loadHTMLFile("some_url_to_html_file");
    
    
    $divs = getElementsByClassName($dom,"st");
    $div = $divs[0];
    
    $str = '';
    foreach ($div->childNodes as $node) {
        $str .= $dom->saveHTML($node);
    }
    
    print_r($str);
    

    下面的函数不是我的,而是this user's。如果您觉得此功能有用,请转到之前链接的答案并投票。

    function getElementsByClassName(DOMDocument $domNode, $className) {
        $elements = $domNode->getElementsByTagName('*');
        $matches = array();
        foreach($elements as $element) {
            if (!$element->hasAttribute('class')) {
                continue;
            }
            $classes = preg_split('/\s+/', $element->getAttribute('class'));
            if (!in_array($className, $classes)) {
                continue;
            }
            $matches[] = $element;
        }
        return $matches;
    }
    

    【讨论】:

      【解决方案3】:

      PHP 是一种服务器端语言,要做到这一点,您应该使用像 javascript 这样的客户端语言(也可能使用像 jQuery 这样的库,以便于快速进行跨浏览器编码)。然后使用javascript将你需要的数据发送到后端进行处理(Ajax)。

      jQuery 示例:

      var myText = jQuery(".st").text();
      
      jQuery.ajax({
          type: 'POST',
          url: 'myBackendUrl',
          myTextParam: myText,
          success: function(){
              alert('done!');
          },
      });
      

      然后,在php中:

      <?php
          $text = $_POST['myTextParam'];
          // do something with text
      

      【讨论】:

        【解决方案4】:

        使用 jquery/ajax

        然后执行以下操作:

        <script>
        $(document).ready(function() {
        $.ajax({
                type: "POST",
                url: "urltothepageyouneed the info",
                data: { ajax: "ajax", divcontent:$(".st").html()}
                })
        
        });
        </script>
        

        基本上

        $(".st").html()
        

        将返回 HTML

         $(".st").text()
        

        将返回文本

        希望有帮助

        【讨论】:

          【解决方案5】:

          使用XML parser

          $htmlDom = simple_load_string($htmlSource);
          $results = $htmlDom->xpath("//div[@class='st']/text()");
          
          while(list( , $node) = each($result)) {
              echo $node, "\n";
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-12-01
            • 1970-01-01
            • 2010-10-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多