Как пропустить повторяющийся контент из поиска с помощью простого HTML-парсера DOM

Я хочу пропустить определенный повторяющийся контент со страницы HTML, используя простой класс HTML dom. Предположим, как вы видите по этой ссылке: http://www.gutenberg.org/wiki/Category:Agriculture_BookshelfForestry приходит 2 раза.

Один в верхней части имени SD Forestry и ниже только Forestry, Так что у них обоих одинаковые ссылки: /wiki/Forestry что создает много проблем для меня.

Теперь, когда я повторяю это в цикле foreach, используя: $subhtml->find('a[href^="/wiki/"]') он находит все эти ссылки со страницы и имеет такую ​​ссылку, но я хочу, чтобы уникальные ссылки означали только повторения в них.

На этой же странице ищите Horticulture а также Horticulture (Bookshelf) обе они имеют одинаковые ссылки, такие как: /wiki/Horticulture_(Bookshelf), Но я хочу рассматривать их как один раз, поэтому функция или определенный фрагмент кода PHP пропускают повторяющуюся часть содержимого HTML.

Так когда find Функция запускается, она будет просто пропускать повторяющиеся и обрабатывать их только как единичные.

Вот HTML-код:

<div id="content">
  <div id="bodyContent">
    <div id="contentSub"> </div>
    <div id="mw-content-text" lang="en" dir="ltr" class="mw-content-ltr">
      <p>LoC classification S <a href="/w/index.php?title=Agriculture&amp;action=edit&amp;redlink=1" class="new" title="Agriculture (page does not exist)">Agriculture</a> 32863 </p>
      <ul>
        <li> Conservation </li>
        <li> SB <a href="/w/index.php?title=Plant_culture&amp;action=edit&amp;redlink=1" class="new" title="Plant culture (page does not exist)">Plant culture</a> </li>
        <li> sb 300 <a href="/wiki/Horticulture_(Bookshelf)" title="Horticulture (Bookshelf)">Horticulture</a> </li>
        <li> SD <a href="/wiki/Forestry" title="Forestry">Forestry</a> </li>
        <li> SF <a href="/w/index.php?title=Animal_culture&amp;action=edit&amp;redlink=1" class="new" title="Animal culture (page does not exist)">Animal culture</a> </li>
        <li> SF 600 <a href="/w/index.php?title=Veterinary_medicine&amp;action=edit&amp;redlink=1" class="new" title="Veterinary medicine (page does not exist)">Veterinary medicine</a> </li>
        <li> SH <a href="/w/index.php?title=Aquaculture&amp;action=edit&amp;redlink=1" class="new" title="Aquaculture (page does not exist)">Aquaculture</a> </li>
        <li> SK <a href="/w/index.php?title=Hunting_%26_fishing&amp;action=edit&amp;redlink=1" class="new" title="Hunting &amp; fishing (page does not exist)">Hunting &amp; fishing</a> </li>
      </ul>
      <div lang="en" dir="ltr">
        <div id="mw-pages">
          <h2>&nbsp;</h2>
          <div lang="en" dir="ltr" class="mw-content-ltr">
            <h3>F</h3>
            <ul>
              <li><a href="/wiki/Forestry" title="Forestry">Forestry</a></li>
            </ul>
            <h3>H</h3>
            <ul>
              <li><a href="/wiki/Horticulture_(Bookshelf)" title="Horticulture (Bookshelf)">Horticulture (Bookshelf)</a></li>
            </ul>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

Спасибо.

2 ответа

Решение

Если вы хотите получить URL с /wiki/ без дубликатов, просто наведите их на якорь a тогда просто необходим простой цикл. Рассмотрим этот пример:

include 'simple_html_dom.php';
$urls = array();
$url = 'http://www.gutenberg.org/wiki/Category:Agriculture_Bookshelf';
$html = file_get_html($url);
foreach($html->find('a') as $key => $value) {
    if(strpos($value->href, '/wiki/') !== false && strpos($value->href, '/wiki/Category:') === false) {
        $urls[urldecode($value->href)] = $key;
    }
}

$urls = array_values(array_flip($urls));

echo '<pre>';
print_r($urls);

Пример вывода:

Array
(
    [0] => /wiki/Horticulture_(Bookshelf)
    [1] => /wiki/Forestry
    [2] => /wiki/Special:Categories
    [3] => /wiki/Main_Page
    [4] => /wiki/Gutenberg:Contact_Information
    [5] => /wiki/Gutenberg:Project_Gutenberg_Needs_Your_Donation
    [6] => /wiki/Gutenberg:Privacy_policy
    [7] => /wiki/Gutenberg:About
    [8] => /wiki/Gutenberg:General_disclaimer
)

Не уверен, что я понимаю ваш вопрос на 100%, но....

Можете ли вы отслеживать все URL с помощью массива?

$outputedUrls = array();

Когда вы отобразите URL-адреса, вставьте их в массив. Но, прежде чем их выводить, вы должны убедиться, что URL-адрес не существует в $outputedUrls.

if (!in_array($url, $outputedUrls)) {
    echo $url;
    $outputedUrls[] = $url;
}
Другие вопросы по тегам