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

5 ответов


одна строка ниже будет делать нечувствительное к регистру количество слов после удаления всех тегов 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. Strip HTML теги с помощью strip_tags ()
  3. создать массив слов, используя str_word_count (). Аргумент 1 возвращает массив, содержащий все слова, входящие в строку.
  4. использовать array_count_values () захватить слова, используемые более одного раза, считая при наступлении каждого значения в массиве слов.
  5. использовать print_r () для отображения результатов.

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

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

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

Edit: Чарли указывает в комментариях, что такие вещи, как 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>

парсер.в 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;", $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 в space
  • Step2: исправить сломанные теги html (если не исправлена функция striptags будет сломал строку)
  • Шаг 3: полоса html теги
  • Step4&5&6: очистить скрытые пробелы и новые строки/вкладки
  • Step7: обрезать начало и конец строки
  • Step8: преобразуйте каждое слово в массив
  • Step9:Граф Фильтруют Массив

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

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

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

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