Подсчет элементов li из html файла с использованием php

У меня есть HTML файл, который содержит много ярких тегов "li" без тегов заголовка и тела и всего остального. Я хочу считать их с помощью 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="#" onclick="location.href='http://www.varzesh3.com/news/1426832/میروسلاو-ژیوکو-سرمربی-تیم-والیبال-سایپا-شد'; return false;" target="_blank" title="میروسلاو ژیوکو سرمربی تیم والیبال سایپا شد">میروسلاو ژیوکو سرمربی تیم والیبال سایپا شد</a>
</li>
<li >
    <a target="_blank" class="small-news-link" href="#" onclick="location.href='http://www.varzesh3.com/news/1426824/فدرر-از-نظر-فیزیکی-شرایط-سال-قبل-را-ندارم'; return false;" target="_blank" title="فدرر: از نظر فیزیکی شرایط سال قبل را ندارم">فدرر: از نظر فیزیکی شرایط سال قبل را ندارم</a>
</li>
<li >
    <a target="_blank" class="small-news-link" href="#" onclick="location.href='http://www.varzesh3.com/news/1426817/شکست-تیم-&#171;الف&#187;-والیبال-ساحلی-ایران-مقابل-هلند'; return false;" target="_blank" title="شکست تیم &#171;الف&#187; والیبال ساحلی ایران مقابل هلند">شکست تیم &#171;الف&#187; والیبال ساحلی ایران مقابل هلند</a>
</li>
<li class="news-video">
    <a target="_blank" class="small-news-link" href="#" onclick="location.href='http://www.varzesh3.com/news/1426815/5-حرکت-دیدنی-در-لیگ-تابستان-NBA؛-96-04-21'; return false;" target="_blank" title="5 حرکت دیدنی در لیگ تابستان NBA؛ 96/04/21">5 حرکت دیدنی در لیگ تابستان NBA؛ 96/04/21</a>
</li>
<li >
    <a target="_blank" class="small-news-link" href="#" onclick="location.href='http://www.varzesh3.com/news/1426813/معرفی-هیات-مدیره-جدید-صندوق-حمایت-از-پیشکسوتان'; return false;" target="_blank" title="معرفی هیات مدیره جدید صندوق حمایت از پیشکسوتان">معرفی هیات مدیره جدید صندوق حمایت از پیشکسوتان</a>
</li>
<li >
    <a target="_blank" class="small-news-link" href="#" onclick="location.href='http://www.varzesh3.com/news/1426808/رحیمی،-یزدانی-و-قاسمی-در-رده-اول-تا-سوم-جهان'; return false;" target="_blank" title="رحیمی، یزدانی و قاسمی در رده اول تا سوم جهان">رحیمی، یزدانی و قاسمی در رده اول تا سوم جهان</a>
</li>
<li >
    <a target="_blank" class="small-news-link" href="#" onclick="location.href='http://www.varzesh3.com/news/1426792/جوکوویچ-منتظر-رویارویی-با-بردیچ-هستم'; return false;" target="_blank" title="جوکوویچ: منتظر رویارویی با بردیچ هستم">جوکوویچ: منتظر رویارویی با بردیچ هستم</a>
</li>

Ответ 1


Танкс много для вкладов, оцененных
я боролся с этой проблемой почти месяц назад, и я не нашел для этого правильного ответа, и около недели назад, когда мой клиент просто спрашивает об этом, эта проблема просто появляется в виде предупреждения в голове, поэтому я решил чтобы справиться с этим как можно скорее, и я положил на это награду (50 репутации), после 3 дней на это ответили @Blaise и @FrancisEytanDortort! Я лично ценю этих ребят и благодарю их много, но я решил, что около трех дней назад (извините) о том, что я забыл опубликовать свой ответ здесь, сейчас я работаю над очень серьезный проект, и я просто подошел к переполнению стека, когда смогу), поэтому длинный рассказ короткий:
так глупо я, моя точка зрения в том, что я просто хочу достичь этих тегов и захватить их ссылку, и я просто хочу использовать синтаксический анализ, но иногда вы должны использовать свой интеллект i9 в своем уме и думать лучше, поэтому вместо того, чтобы получать теги li, я непосредственно нацелен на теги, и он работает:
вот код

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

и поскольку каждый из этих элементов был сохранен в БД, тогда я не могу получить количество их из БД с запросами mysql, Что это!
Спасибо

Ответ 2

Ты близко. Я думаю, что вы ищете следующее:

$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, содержащим количество найденных узлов.

Вы можете попробовать код здесь.

Этот подход DOM синтаксический анализ предпочтительнее поиска в строках или регулярных выражениях, поскольку он предназначен для учета многих переменных способов, которыми HTML может быть приемлемо написан (т.е. несогласованный интервал, порядок атрибутов).

Ответ 3

Вы можете сделать очень простую Substring Count для <li> (или -li-) в этой строке, и она вернет количество элементов. См. Здесь: function.substr-count

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

Ответ 4

Ты был близок.

Попробуйте следующее:

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

И измените этот echo count($count); на echo $count

Ответ 5

Ну, во-первых, loadHTML загружается из HTML внутри строки. Если $tmp_file - это имя файла, вы должны использовать loadHTMLFile.

Кроме того, loadHTML не является статическим, поэтому вам нужно сделать $dom->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

Внутри <ul> я установил четыре элемента <li>.

Ответ 6

Не могли бы вы попробовать что-то вроде этого? $url - путь к вашему html файлу?

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

echo($count);
exit();

Ответ 7

Если вы уверены, что все строки одинаковы, вам даже не нужно проверять тег <li>. Просто сделайте быстрый подсчет количества строк в файле и разделите на 3:

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

$html_file должен быть просто путь к файлу. Вам не нужно анализировать HTML, поэтому не нужно создавать новый DOMDocument. Это намного эффективнее, но только если вы точно знаете, что весь файл отформатирован таким образом.

Ответ 8

Вы просто используете следующий код для получения li count из данных страницы html

 $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

Ответ 9

Вы также можете использовать:

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

Результаты тестирования:

[email protected]:/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>


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

Ответ 10

Это работает для меня (помещая ваш пример 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);

Ответ 12

Я могу вам помочь.

Вы должны использовать этот код:

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