PHP DOM:如何获取包含文本节点属性的包装器标签?

时间:2015-04-05 21:20:49

标签: php html dom

我想获取文本节点的包装器标签。鉴于这样一个任意的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>

我想获得&#34;包装标签1&#34;

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

这只是用于演示,它们可以是任何内容,但是如果文本匹配,我该如何检索包装器标签?

我一直在考虑使用php dom,并通过树来查找textnode,并从中回过头来。我不确定如何提取包装器标签。

$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);
    }
}

1 个答案:

答案 0 :(得分:0)

我使用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中进行一些配置。

希望这能帮助您明白问题