Подсчет элементов 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/شکست-تیم-«الف»-والیبال-ساحلی-ایران-مقابل-هلند'; return false;" target="_blank" title="شکست تیم «الف» والیبال ساحلی ایران مقابل هلند">شکست تیم «الف» والیبال ساحلی ایران مقابل هلند</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/شکست-تیم-«الف»-والیبال-ساحلی-ایران-مقابل-هلند" target="_blank" title="شکست تیم «الف» والیبال ساحلی ایران مقابل هلند">شکست تیم «الف» والیبال ساحلی ایران مقابل هلند</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/شکست-تیم-«الف»-والیبال-ساحلی-ایران-مقابل-هلند" target="_blank" title="شکست تیم «الف» والیبال ساحلی ایران مقابل هلند">شکست تیم «الف» والیبال ساحلی ایران مقابل هلند</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);
Ответ 11
Вы можете использовать PHP Simple HTML DOM Parse:
http://simplehtmldom.sourceforge.net/
echo count($html->find('li'));
Ответ 12
Я могу вам помочь.
Вы должны использовать этот код:
$numberOfListItems= $domElement->getElementsByTagName("li")->length;