使用 php 从 html 文件中计算 li 项

Posted

技术标签:

【中文标题】使用 php 从 html 文件中计算 li 项【英文标题】:Counting li items from a html file using php 【发布时间】:2017-12-16 13:00:05 【问题描述】:

我有一个 html 文件,其中包含许多 JUST “li”标签,没有 head 和 body 标签以及其他任何东西。我想用 php 来计算它们。我该怎么做?

但是,我尝试了这个:

$dom = new DOMDocument();
DOMDocument::loadHTML($tmp_file);
$count = $dom->getElementsByTagName("li");
echo count($count);

但它返回 1。

这是 $tmp_file (我不知道将检索到多少个(可能有数百个),但我只是将其中的 5 个添加到这里):

<li >
    <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426832/میروسلاو-ژیوکو-سرمربی-تیم-والیبال-سایپا-شد" target="_blank" title="میروسلاو ژیوکو سرمربی تیم والیبال سایپا شد">میروسلاو ژیوکو سرمربی تیم والیبال سایپا شد</a>
</li>
<li >
    <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426824/فدرر-از-نظر-فیزیکی-شرایط-سال-قبل-را-ندارم" target="_blank" title="فدرر: از نظر فیزیکی شرایط سال قبل را ندارم">فدرر: از نظر فیزیکی شرایط سال قبل را ندارم</a>
</li>
<li >
    <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426817/شکست-تیم-&#171;الف&#187;-والیبال-ساحلی-ایران-مقابل-هلند" target="_blank" title="شکست تیم &#171;الف&#187; والیبال ساحلی ایران مقابل هلند">شکست تیم &#171;الف&#187; والیبال ساحلی ایران مقابل هلند</a>
</li>
<li class="news-video">
    <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426815/5-حرکت-دیدنی-در-لیگ-تابستان-NBA؛-96-04-21" target="_blank" title="5 حرکت دیدنی در لیگ تابستان NBA؛ 96/04/21">5 حرکت دیدنی در لیگ تابستان NBA؛ 96/04/21</a>
</li>
<li >
    <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426813/معرفی-هیات-مدیره-جدید-صندوق-حمایت-از-پیشکسوتان" target="_blank" title="معرفی هیات مدیره جدید صندوق حمایت از پیشکسوتان">معرفی هیات مدیره جدید صندوق حمایت از پیشکسوتان</a>
</li>
<li >
    <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426808/رحیمی،-یزدانی-و-قاسمی-در-رده-اول-تا-سوم-جهان" target="_blank" title="رحیمی، یزدانی و قاسمی در رده اول تا سوم جهان">رحیمی، یزدانی و قاسمی در رده اول تا سوم جهان</a>
</li>
<li >
    <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426792/جوکوویچ-منتظر-رویارویی-با-بردیچ-هستم" target="_blank" title="جوکوویچ: منتظر رویارویی با بردیچ هستم">جوکوویچ: منتظر رویارویی با بردیچ هستم</a>
</li>

【问题讨论】:

你能粘贴一些它正在查看的 html 吗? 和其他许多类似的 li 标签... 请使用任何其他信息/代码更新您的问题,而不是在评论中。 它返回“1”,因为它返回为真。 请检查您的错误日志(或者更好的是,打开显示错误,方法如下:***.com/questions/5438060/…)并检查您在尝试解析内容时是否收到一堆警告。 【参考方案1】:

你已经接近了。我认为您正在寻找的是以下内容:

$dom = new \DOMDocument();
@$dom->loadHTML($html); // or @$dom->loadHTMLFile($filename); if providing filename rather than actual HTML content

$count = $dom->getElementsByTagName('li')->length;
echo $count;

根据您的$tmp_file 值,如果它包含实际内容,您将使用loadHTML(),如果它包含文件名,则使用loadHTMLFile()。 (请注意,这些方法不应被静态调用。)

getElementsByTagName() 方法返回一个 DOMNodeList 对象,该对象的 length 属性包含找到的节点数。

你可以试试代码here。

这种 DOM 解析 方法比字符串或正则表达式搜索更可取,因为它旨在说明 HTML 可以被接受的许多可变编写方式(即不一致的间距、属性顺序)。

【讨论】:

如上所述,长度不起作用,它应该是长度(),顺便说一句,thanx man,我会尽快将我的答案发布给她 它确实应该是-&gt;length 而不是-&gt;length(),因为lengthDOMNodeList属性,而不是方法,和属性在没有括号的情况下访问。如果您仍然没有得到所需的输出,那么问题出在其他地方,可能是使用loadHTML() 而不是loadHTMLFile()【参考方案2】:

您可以在该字符串上为&lt;li&gt;(或-li-)执行一个非常简单的Substring Count,它将返回项目数。 见这里:function.substr-count

$count = substr_count($html,'<li>'); //where $html holds your piece of HTML.

【讨论】:

仍然返回 0 在 OP 在评论中发布的示例中,它实际上是 &lt;li &gt;(有一个额外的空格)。 还是零哥们(有额外空间)! 当我尝试使用您问题中的 HTML 时,@Er.Ellison substr_count($html,'&lt;li &gt;'); 非常适合我。当然,您需要将$html 更改为实际保存您的HTML 数据的变量。试试看:3v4l.org/daX97 如果你打算走这条路,我建议检查&lt;/li&gt;&lt;li 这样你就可以避免担心标签中的额外空间/属性。【参考方案3】:

你很亲密。

试试这个:

$count = $dom->getElementsByTagName("li")->length;

并将此 echo count($count); 更改为 echo $count

【讨论】:

它不识别长度 对不起,是-&gt;length 这很有趣, 这次返回 0 :)))))) @Er.Ellison 请查看我对您的问题的评论。【参考方案4】:

首先,loadHTML 从字符串中的 HTML 加载。如果 $tmp_file 是文件名,你应该使用 loadHTMLFile。

另外,loadHTML 不是静态的,所以你需要做$dom-&gt;loadHTML($tmp_file);

现在是问题的答案。

getElementsByTagName() 返回的是一个 DOMNodeList。作为一个对象,count() 函数可能只会说 1,但 DOMNodeList 有一个名为 length 的属性。如果您只查询li 元素,然后读取length,它将给出li 元素的数量。

作为测试:

$dom = new DOMDocument();
$dom->loadHTML("<li>test 1</li><li>test 2</li><li>test 3</li><li>test 4</li>");
$count = $dom->getElementsByTagName("li");
echo $count->length; //Prints 4

&lt;ul&gt; 内,我设置了四个&lt;li&gt; 元素。

【讨论】:

$tmp_file 正在从链接中检索数据并使用 file_put_contents 将其放入 tmp 文件,所以,到目前为止,我有一个 html 文件,其中只包含“li”标签(即使我尝试过在浏览器中加载 tmp 文件,它只是向我显示了一些疯狂的字符),它没有任何 body 或 html 标签 @Er.Ellison 没关系,这只是一个例子。您只能放置&lt;li&gt; 标签并且它可以工作。我会改变我的例子来反映你的情况。 相信我,我正在尝试如你所说,但它返回 0 ,这是返回结果: 你首先看到的是 echo $count->length 的结果中的零; 你能发布echo $tmp_file; 显示的内容吗?只是为了丢弃东西。另外,你在用$dom-&gt;loadHTML() 吗?【参考方案5】:

你能试试这样的吗? $url 是您的 html 文件的路径?

$data = file($url);
$count = null;
foreach($data as $line)
    if (strpos($line,'<li'))
        ++$count;
    


echo($count);
exit();

【讨论】:

不,兄弟,我认为您的回答中有错字,在'',感谢您回答我的问题,我已经用另一种天才的方式解决了这个问题,对此感到抱歉我忘了在这里发布我的答案,我目前正在做一个非常严肃的项目,我只是在可能的时候过来堆栈溢出,顺便说一句,首先感谢 Blaise(我的男人),其次,我'我会尽快在这里发布我的答案!非常感谢你们! 哈哈!很高兴你找到了答案。由于代码中的空格,我故意省略了开始 标记的关闭!【参考方案6】:

如果您确定所有行都相同,您甚至不需要检查&lt;li&gt; 标记。只需快速计算文件中的行数并除以 3:

$total_lines = count(file($html_file));
$num_list_items = $total_lines / 3; 

$html_file 应该只是文件的路径。您无需解析 HTML,因此无需创建新的 DOMDocument。这样效率更高,但前提是您确定整个文件都以这种方式格式化。

【讨论】:

【参考方案7】:

您只需使用以下代码从 html 页面数据中获取 li 计数

 $html_page_data='<li >
            <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426832/میروسلاو-ژیوکو-سرمربی-تیم-والیبال-سایپا-شد" target="_blank" title="میروسلاو ژیوکو سرمربی تیم والیبال سایپا شد">میروسلاو ژیوکو سرمربی تیم والیبال سایپا شد</a>
        </li>
        <li >
            <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426824/فدرر-از-نظر-فیزیکی-شرایط-سال-قبل-را-ندارم" target="_blank" title="فدرر: از نظر فیزیکی شرایط سال قبل را ندارم">فدرر: از نظر فیزیکی شرایط سال قبل را ندارم</a>
        </li>
        <li >
            <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426817/شکست-تیم-&#171;الف&#187;-والیبال-ساحلی-ایران-مقابل-هلند" target="_blank" title="شکست تیم &#171;الف&#187; والیبال ساحلی ایران مقابل هلند">شکست تیم &#171;الف&#187; والیبال ساحلی ایران مقابل هلند</a>
        </li>';
          $doc = new DOMDocument();
          $doc->loadHTML($html_page_data);
          libxml_clear_errors();
          $xpath = new DOMXPath($doc);
          $query = '//li'; //query pattern for find li
          $li_data= $xpath->query($query);
    echo  $li_data->length ; //output 3

【讨论】:

【参考方案8】:

你也可以使用:

echo preg_match_all("~<li([^>]*)>~",file_get_contents("your_html_file")).PHP_EOL;

测试结果:

akshay@db-3325:/tmp$ cat file
<li >
    <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426832/میروسلاو-ژیوکو-سرمربی-تیم-والیبال-سایپا-شد" target="_blank" title="میروسلاو ژیوکو سرمربی تیم والیبال سایپا شد">میروسلاو ژیوکو سرمربی تیم والیبال سایپا شد</a>
</li>
<li >
    <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426824/فدرر-از-نظر-فیزیکی-شرایط-سال-قبل-را-ندارم" target="_blank" title="فدرر: از نظر فیزیکی شرایط سال قبل را ندارم">فدرر: از نظر فیزیکی شرایط سال قبل را ندارم</a>
</li>
<li >
    <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426817/شکست-تیم-&#171;الف&#187;-والیبال-ساحلی-ایران-مقابل-هلند" target="_blank" title="شکست تیم &#171;الف&#187; والیبال ساحلی ایران مقابل هلند">شکست تیم &#171;الف&#187; والیبال ساحلی ایران مقابل هلند</a>
</li>
<li class="news-video">
    <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426815/5-حرکت-دیدنی-در-لیگ-تابستان-NBA؛-96-04-21" target="_blank" title="5 حرکت دیدنی در لیگ تابستان NBA؛ 96/04/21">5 حرکت دیدنی در لیگ تابستان NBA؛ 96/04/21</a>
</li>
<li >
    <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426813/معرفی-هیات-مدیره-جدید-صندوق-حمایت-از-پیشکسوتان" target="_blank" title="معرفی هیات مدیره جدید صندوق حمایت از پیشکسوتان">معرفی هیات مدیره جدید صندوق حمایت از پیشکسوتان</a>
</li>
<li >
    <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426808/رحیمی،-یزدانی-و-قاسمی-در-رده-اول-تا-سوم-جهان" target="_blank" title="رحیمی، یزدانی و قاسمی در رده اول تا سوم جهان">رحیمی، یزدانی و قاسمی در رده اول تا سوم جهان</a>
</li>
<li >
    <a target="_blank" class="small-news-link" href="http://www.varzesh3.com/news/1426792/جوکوویچ-منتظر-رویارویی-با-بردیچ-هستم" target="_blank" title="جوکوویچ: منتظر رویارویی با بردیچ هستم">جوکوویچ: منتظر رویارویی با بردیچ هستم</a>
</li>


akshay@db-3325:/tmp$ php -r 'echo preg_match_all("~<li([^>]*)>~",file_get_contents("file")).PHP_EOL;'
7

【讨论】:

【参考方案9】:

这对我有用(将您的示例 HTML 放在一个名为“index.html”的文件中):

<?php
$dom = new DOMDocument();
$dom->loadHTMLFile("index.html");
$count = $dom->getElementsByTagName("li");
printf("Count: %d\n", count($count));

编辑:尽管如前所述,您可以跳过count()

$li_elems = $dom->getElementsByTagName("li");
printf("Count: %d\n", $li_elems->length);

【讨论】:

【参考方案10】:

您可以使用 PHP Simple HTML DOM Parse: http://simplehtmldom.sourceforge.net/

echo count($html->find('li'));

【讨论】:

如果正确,请检查为正确答案)))【参考方案11】:

我可以帮你。

你应该使用这个代码:

$numberOfListItems= $domElement-&gt;getElementsByTagName("li")-&gt;length;

$numberOfListItems 包含所需的值

【讨论】:

【参考方案12】:

那个问题的重点是我只想实现一个标签并获取它们的链接,我只想使用解析,但有时你应该在脑海中使用你的英特尔 i9 并更好地思考,所以而不是获取&lt;li&gt; 标签我直接针对&lt;a&gt; 标签,它的工作原理:

代码如下:

$this->dom = new DOMDocument();
@$this->dom->loadHTMLfile($tmp_file);
$this->as = $this->dom->getElementsByTagName('a');
foreach($this->as as $a)  ...

并且由于每个项目都保存到数据库中,所以我无法使用 mysql 查询从数据库中获取它们的数量,就是这样!

【讨论】:

以上是关于使用 php 从 html 文件中计算 li 项的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 从 HTML 列表生成 XML

从平面数据在 PHP 中构建分层 html 标签

如何从 PHP 文件中提取 HTML?

php:多个页面调用同一个导航

我在HTML中写了一个<ul><li>标签 ,怎麼把数据库的数据动态动态生成到标签里面??php

PHP全栈开发: HTML 学习(2. div 布局)