【问题标题】:Simple dom parser results in multiple pages简单的 dom 解析器导致多个页面
【发布时间】:2019-03-16 09:19:00
【问题描述】:

我已经解析了一个页面来获取标题,有时解析的标题超过 11 个。我设计的模板最多包含 11 个标题。我的问题是如何为其余标题(从 12 -> n)复制模板()。对于其余的结果,我必须以某种方式复制模板,但我不知道具体如何。 Bellow 是我的模板,女巫正在显示所有结果。

<?php 
    include('parse/simple_html_dom.php'); 
    $url = 'link-to-url';
    $html = file_get_html($url);
    $headlines = array();
    $i = 0;
?>
<div class="pf w0 h0">
    <div class="w0 h0">
        <div class="header-pagina">
            <svg role="img"  class="header37"><use xlink:href="#header-hp"></use></svg>
        </div>

        <div class="page-wrapper">
            <?php 
           foreach($html->find('.cmsmasters_row[1] .cmsmasters_toggle_title') as $title) {
                    $i++;
                        echo '<div class="agenda-curs">';
                        echo '<div class="agenda-tab"><span class="modul-tab-text color1" contenteditable="true">Modulul '.$i.'</span></div>';   
                        echo '<div class="agenda-text" contenteditable="true">'.$headlines[] = $title->plaintext.'</div >';

                        echo '</div>';
            }
            $head = implode("", $headlines);
            ?>
        </div>
        <svg role="img" class="footer35"><use xlink:href="#footer35"></use></svg>
    </div>
</div>

【问题讨论】:

  • 仅供参考,implode() 不需要胶水,如果你想加入一个空字符串。它认为您的问题可能过于宽泛。您想在页面上的哪里写分页按钮/链接?你在 Stackoverflow 上搜索过分页页面吗?
  • 不,我不想要分页,我想复制 12-22 解析结果的模板,即“
    .. 。”
  • 所以你想在 10 次迭代后 break 你的 foreach() 并编写一个 while() 循环来获取所有结果?我建议您在开始打印到屏幕之前完成所有处理。你可以批量处理内爆的$heads 对吗?
  • 我不知道该怎么做
  • 在这方面需要一些帮助吗,有人吗?

标签: php parsing dom


【解决方案1】:

我不知道您在脚本中使用$head = implode("", $headlines); 做什么,但您可以从下面的$headlinesheadline_batch 收集您想要的数据。

将处理与打印分开将使您的代码更易于阅读和维护。我可以编写脚本来使用更少的循环,但我更喜欢可读性而不是效率。

<?php 
include('parse/simple_html_dom.php'); 
$url = 'link-to-url';
$html = file_get_html($url);
$headlines = array();
$counter = 0;
foreach($html->find('.cmsmasters_row[1] .cmsmasters_toggle_title') as $title) {
    $headlines[++$counter] = $title->plaintext;
}

// no more processing, just printing
foreach (array_chunk($headlines, 10, true) as $headline_batch) {
    ?>
    <div class="pf w0 h0">
        <div class="w0 h0">
            <div class="header-pagina">
                <svg role="img"  class="header37"><use xlink:href="#header-hp"></use></svg>
            </div>
            <?php

            foreach ($headline_batch as $counter => $title) {
                echo '<div class="agenda-curs">
                          <div class="agenda-tab"><span class="modul-tab-text color1" contenteditable="true">Modulul ' . $counter . '</span></div>
                          <div class="agenda-text" contenteditable="true">' . $title . '</div >
                      </div>';
            }

            ?>
            </div>
            <svg role="img" class="footer35"><use xlink:href="#footer35"></use></svg>
        </div>
    </div>
    <?php
}
?>

使用array_chunk($headlines, 10, true) 将使您不必在循环中使用模数条件来检查是否应启动新组。 true 参数在分组后保留$counter 值。

【讨论】:

  • 非常感谢,这正是我所需要的。。现在有一个类似的问题,你有一点额外的时间来看看吗?
  • 很抱歉听到这个消息,我希望不是什么严重的事情。我已经粘贴了这段代码,链接是:3v4l.org/Cr6Ie 我的问题是我必须解析 2 个变量,并将它们放在同一个模板中。其中一个变量正在重复......我如何将这两个 foreach 合并为一个?
  • 让我问...你真的需要将新元素推入headheadlines吗?在生成这些数组后,我没有看到您的脚本使用它们。
  • 再次,您应该提取所有值并准备它们(使用 strpos&substr 而不是 strstr&substr)并将它们成对存储,然后使用静态 html 输出配对数据。这样会更干净。
  • 我不知道如何重新排列代码,你在它之前所做的很棒,我不确定我是否能找到这些解决方案。
猜你喜欢
相关资源
最近更新 更多
热门标签