Подсчет слов на веб-странице html с использованием php

Мне нужен 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-скрипт, который уже делает это?

В одной строке ниже будет учитываться регистр без учета регистра после удаления всех тегов 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 (), чтобы отобразить результаты.

В приведенном ниже скрипте будет отображаться содержимое удаленного URL-адреса, удалить теги html и подсчитать вхождения каждого уникального слова в нем.

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

Кроме того, поскольку на входе выполняется только базовый 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 ) 

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

Это мой код для подсчета слов, содержащих теги 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-теги (если функция фиксированных striptags не будет разбита)
  • Шаг 3. Шаблоны html-тегов
  • Step4 & 5 & 6: Очистить скрытые пробелы и новые строки / вкладки
  • Шаг 7: начало и конец строки
  • Шаг 8. Преобразование каждого слова в массив.
  • Step9: Count Filtered Array

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

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

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

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