【问题标题】:PHP DOM: How to get wrapper tags with attributes for a text node?PHP DOM:如何获取带有文本节点属性的包装标签?
【发布时间】:2015-04-06 05:40:09
【问题描述】:

我想获取文本节点的包装标签。给定这样一个任意的html

<html><body>
<p>salalala</p>
<ul><li>hehehe</li></ul>
<div class="main">
    <div class="text">
    <span style="cufon whatever blablabla">
    Capture this text 1
    </span>
    </div>
</div>

<div class="main">
    <div class="text">
    text 2
    </div>
</div>
</body>
</html>

我想获取“捕获此文本 1”的包装标签

<div class="main">
    <div class="text">
    <span style="cufon whatever blablabla">

这只是为了演示,它们可以是任何东西,但是给定一个文本匹配,我如何检索包装器标签?

我一直在考虑使用 php dom,并逐步通过树找到文本节点,然后从那里开始工作。我不确定如何提取包装标签。

$doc = new DOMDocument();
$doc->loadHTML($html);
//print_r($doc->childNodes);

print_children($doc);


function print_children($object){

    if ($object->nodeName == "#text" AND strpos("Capture this text 1",trim($object->data)) !== false) {
        print "Parent: ";
        print_r($object->parentNode);
        }

    foreach($object->childNodes as $child) {
    print_r($child);
    print_children($child);
    }
}

【问题讨论】:

    标签: php html dom


    【解决方案1】:

    我使用 fsockopen 在我想要的某个网站中检索一些 HTML。这是我目前的功能如何做到这一点。

    $server  = 'www.somesite.com';  // or an IP address
    $port    = 80;
    
    function getTextFromHTML($server, $port, $timeout=100){
        $socket  = fsockopen( $server, $port, $errno, $errstr, $timeout );
        fputs( $socket, $request );
        if ( $size > 0 ) {
            $start_el = 'div class="main">';
            $stop_el = '</div>';
            $f_start = false;
            $f_stop = false;
    
            $tmp="";
            while (!feof($socket))
            {
                $buffer = fgets($socket,$size);
                if(!$f_start){
                    $strpos = mb_strpos($buffer, $start_el);
                    if ($strpos !== false)
                    {
                        $buffer = mb_substr($buffer, $strpos, $size);
                        $f_start = true;
                    }
                }
    
                if ($f_start && !$f_stop)
                {
                    $strpos = mb_strpos($buffer, $stop_el);
                    if ($strpos !== false)
                    {
                        $f_stop = true;
                    }
                    $tmp .= $buffer;
                }
            }               
    
        }       
        fclose( $socket );
        return $tmp;
    }
    

    您只需要在 $start_el 和 $stop_el 中进行一些配置。

    希望这能帮助您解决问题

    【讨论】:

      猜你喜欢
      • 2011-01-24
      • 2021-02-22
      • 2015-06-03
      • 2020-06-21
      • 1970-01-01
      • 2012-01-13
      • 2010-11-30
      相关资源
      最近更新 更多