0

我正在尝试将我的页面链接到另一个网站,我可以在其中使用 div 标签以使我的网站保持最新。

经过一番研究,我得到了一些代码,它只回显了 1 个字符串,而页面上有多个 div 类,我想将它们全部回显。我只是想知道这是否可能?

这是当前代码:

<?php
$url = 'http://www.domain.com';
$content = file_get_contents($url);
$activity = explode( '<div class="class">' , $content );
$activity_second = explode("</div>" , $activity );

echo $activity_second[0];
?>

我可以回$activity_second[0]显哪个将显示第一行,$activity_second[1]哪个将显示第二行。

但是,我希望对此进行扩展,以允许将同一页面上的所有 div 类放入一个数组中,然后该数组可以回显到表的不同部分。

提前谢谢你的帮助。

4

4 回答 4

1

让我看看我是否明白了,你有这样的事情:

<div id="another-class"><div class="class">some text 1</div></div>
<div class="class">some text 2</div>
<div class="class">some text 3</div>
<div class="class">some text 4</div>
<div class="class">some text 5</div>
<div class="class">some text 6</div>

您需要包含 div 元素的文本。如果这是正确的,请替换:

$activity = explode( '<div class="class">' , $content );
$activity_second = explode("</div>" , $activity );

有了这个:

preg_match_all('#<div class="class">(.+?)</div>#', $content, $matches);

在本例中,函数调用后 $matches 将具有以下内容:

Array
(
    [0] => Array
        (
            [0] => <div class="class">some text 1</div>
            [1] => <div class="class">some text 2</div>
            [2] => <div class="class">some text 3</div>
            [3] => <div class="class">some text 4</div>
            [4] => <div class="class">some text 5</div>
            [5] => <div class="class">some text 6</div>
        )

    [1] => Array
        (
            [0] => some text 1
            [1] => some text 2
            [2] => some text 3
            [3] => some text 4
            [4] => some text 5
            [5] => some text 6
        )

)

您需要的数据在 $matches[1] 中。

于 2016-03-16T16:01:50.217 回答
0

如果您的意图是获取具有该类名称的 div 的所有内容,则可以使用正则表达式捕获这些 div 的标签之间的这些字符串:

preg_match_all('/<div class="class">([^<]+)<\/div>/', $content, $m);

print_r($m[1]);

现在$m[1]将是一个包含这些 div 的所有内部 HTML 字符串的数组。

于 2016-03-16T15:51:55.713 回答
0

问题可能是只有第一个数组的第一个键进入第二个爆炸。在 $activity 之后尝试以下操作:

$result = array();

foreach ($activity as $div){
    $handle = explode("</div>", $div);
    $result -> append($handle);
}
foreach ($result as $key){
   echo $key;
}

我很抱歉原来的回复,我误解了你的问题。

正则表达式方式也将起作用。

于 2016-03-16T15:48:11.687 回答
0

规则是:当我使用 HTML 时,我必须使用解析器。

假设你有一个这样的 HTML 文档:

$html = '<html>
<head><title>Untitled</title></head>
<body>
    <div class="class">
        <b>My Content 1</b>
    </div>
    <div class="class">
        <b>My Content 2</b>
    </div>
    <div class="class">
        <b>My Content 3</b>
    </div>
</body>
</html>';

将其加载到一个对象中,根据加载的 HTMLDOMDocument初始化一个对象:DOMXPath

$dom = new DOMDocument();
libxml_use_internal_errors(1);
$dom->formatOutput = True;
$dom->loadHTML( $html );
$xpath = new DOMXPath( $dom );

使用此命令,您可以访问所有内容<div class="class">

foreach( $xpath->query( '//div[@class="class"]' ) as $node )
{
    echo trim( $node->nodeValue ) . '<br>';
}

你的输出:

My Content 1
My Content 2
My Content 3

如果要将节点回显为 HTML,请替换echo ...

和:

echo $dom->saveHTML( $node );

将输出:

<div class="class">
    <b>My Content 1</b>
</div>
<div class="class">
    <b>My Content 2</b>
</div>
<div class="class">
    <b>My Content 3</b>
</div>

最后,如果您只想回显节点的innerHTML,则必须编写如下内容:

foreach( $xpath->query( '//div[@class="class"]' ) as $node )
{
    foreach ($node->childNodes as $child) 
    { 
        echo $dom->saveHTML( $child );
    }
}

你的输出将是:

<b>My Content 1</b>
<b>My Content 2</b>
<b>My Content 3</b>

于 2016-03-16T16:01:21.297 回答