Подсчет слов на HTML-странице с помощью PHP - PullRequest
9 голосов
/ 15 августа 2010

Мне нужен PHP-скрипт, который берет URL-адрес веб-страницы, а затем отображает, сколько раз упомянуто слово.

Пример

Это общая страница HTML:

<html>
<body>
<h1> This is the title </h1>
<p> some description text here, <b>this</b> is a word. </p>
</body>
</html>

Это будет скрипт PHP:

<?php
htmlurl="generichtml.com";
the script here
echo(result);
?>

Таким образом, вывод будет такой таблицей:

WORDS       Mentions
This        2
is          2
the         1
title       1
some        1
description 1
text        1
a           1
word        1

Это похоже на то, что делают поисковые роботы, когда они бродят по сети, так что, есть идеи, как начать, или даже лучше, у вас есть PHP-скрипт, который уже делает это?

Ответы [ 5 ]

24 голосов
/ 15 августа 2010

В одной строке ниже будет учитываться регистр слов без учета регистра после удаления всех тегов HTML из вашей строки.

Живой пример

print_r(array_count_values(str_word_count(strip_tags(strtolower($str)), 1)));

Чтобы получить исходный код страницы, вы можете использовать cURL или file_get_contents ()

$str = file_get_contents('http://www.example.com/');

Изнутри:

  1. Используйте strtolower () , чтобы сделать все в нижнем регистре.
  2. Обрезать теги HTML с помощью strip_tags ()
  3. Создать массив слов, используя str_word_count () . Аргумент 1 возвращает массив, содержащий все слова, найденные в строке.
  4. Используйте array_count_values ​​() для захвата слов, использованных более одного раза, путем подсчета вхождения каждого значения в ваш массив слов.
  5. Используйте print_r () для отображения результатов.
5 голосов
/ 15 августа 2010

Сценарий ниже будет считывать содержимое удаленного URL, удалять HTML-теги и подсчитывать вхождения каждого уникального слова в нем.

Предостережение: в вашем ожидаемом выводе значение "This" имеет значение 2, но ниже учитывается регистр, поэтому и "this", и "This" записываются как отдельные слова. Вы можете преобразовать всю входную строку в нижний регистр перед обработкой, если исходный регистр не имеет значения для ваших целей.

Кроме того, поскольку на входе запускаются только базовые метки strip_tags, неправильно сформированные теги не будут удалены, поэтому предполагается, что ваш исходный html действителен.

Редактировать: Чарли указывает в комментариях, что такие вещи, как head, все равно будут учитываться. С помощью функции, определенной в пользовательских примечаниях функции strip_tags , теперь об этом также заботятся.

generichtml.com

<html>
<body>
<h1> This is the title </h1>
<p> some description text here, <b>this</b> is a word. </p>
</body>
</html>

parser.php

// Fetch remote html
$contents = file_get_contents($htmlurl);

// Get rid of style, script etc
$search = array('@<script[^>]*?>.*?</script>@si',  // Strip out javascript
           '@<head>.*?</head>@siU',            // Lose the head section
           '@<style[^>]*?>.*?</style>@siU',    // Strip style tags properly
           '@<![\s\S]*?--[ \t\n\r]*>@'         // Strip multi-line comments including CDATA
);

$contents = preg_replace($search, '', $contents); 

$result = array_count_values(
              str_word_count(
                  strip_tags($contents), 1
                  )
              );

print_r($result);

?>

Выход:

Array
(
    [This] => 1
    [is] => 2
    [the] => 1
    [title] => 1
    [some] => 1
    [description] => 1
    [text] => 1
    [here] => 1
    [this] => 1
    [a] => 1
    [word] => 1
)
0 голосов
/ 21 ноября 2016

Это мой код для подсчета слов, содержащих HTML-теги:

$sayilacak_metin = str_replace("&nbsp;", " ", $sayilacak_metin);
$sayilacak_metin = preg_replace("/<([^>]*(<|$))/", "&lt;$1", $sayilacak_metin);
$sayilacak_metin = strip_tags($sayilacak_metin);
$sayilacak_metin = str_replace(chr(194)," ",$sayilacak_metin);
$sayilacak_metin = str_replace(chr(160)," ",$sayilacak_metin);
$sayilacak_metin = preg_replace(array('/\s{2,}/', '/[\r\t\n]/','/\r/','/\t/','/\n/'), ' ', $sayilacak_metin);
$sayilacak_metin=trim($sayilacak_metin);
$parca = explode(" ", $sayilacak_metin);
$sonuc=count(array_filter($parca));
  • Шаг1: конвертировать все nbsp в пробел
  • Шаг 2: исправить битые теги html (если не исправлена ​​функция стриптагов, будет разрыв строки)
  • Шаг 3: убрать теги html
  • Шаг 4, 5 и 6: Очистить скрытые пробелы и новую строку / вкладки
  • Step7: обрезать начало и конец строки
  • Шаг 8: преобразовать каждое слово в массив
  • Step9: считать фильтрованный массив
0 голосов
/ 15 августа 2010

Это сложная работа, которую вы не должны выполнять самостоятельно.

Вы должны извлечь текст, который не является частью тегов / комментариев и не является дочерним для таких элементов, как script и style.Для этого вам также понадобится слабый HTML-парсер (например, реализованный в libxml2 и используемый в DOMDocument.

. Затем вам нужно токенизировать текст, который представляет свой собственныйпроблемы. Наконец, перед тем, как приступить к подсчету терминов, вы бы заинтересовались какой-либо формой , стоящей .

Я рекомендую использовать для этого специализированные инструменты. Я не использовал ни одного из них,но вы можете попробовать HTMLParser для парсинга и Lucene для токенизации / стемминга (цель Lucene - Text Retrieval , но эти операции необходимы для построения индекса).

0 голосов
/ 15 августа 2010

Предыдущий код - это точка, с которой начинается.Следующим шагом является удаление HTML-тегов с регулярными выражениями.Ищите функции ereg и eregi.Для тегов стиля и сценариев требуются некоторые другие приемы (необходимо удалить содержимое). Точки и запятые тоже должны быть удалены ...

...