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

Author: Timwi, 2010-08-15

5 answers

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

Живой Пример

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

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

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

Изнутри наружу:

  1. Использовать стратолауэр() чтобы все было в нижнем регистре.
  2. Удалите HTML-теги с помощью теги strip_tags()
  3. Создайте массив слов, используемых с помощью str_word_счет(). Аргумент 1 возвращает массив, содержащий все слова, найденные внутри строки.
  4. Использовать array_count_значения() для захвата слов, используемых более одного раза, путем подсчета встречаемости каждого значения в вашем массиве слов.
  5. Использовать печать_r() для отображения результатов.
 24
Author: Peter Ajtai, 2010-08-15 01:01:03

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

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

Кроме того, поскольку выполняется только базовый 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
)
 5
Author: ConroyP, 2010-08-15 00:42:23

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

 0
Author: Charlie, 2010-08-15 00:25:17

Это мой код для подсчета слов, содержащих 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-теги
  • Шаг 4&5&6: Очистите скрытые пробелы и новую строку/вкладки
  • Шаг 7: Обрезать начало и конец строки
  • Шаг 8: Преобразуйте каждое слово в массив
  • Шаг 9: Подсчет отфильтрованного массива
 0
Author: Adil YILDIZ, 2016-11-21 07:59:18

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

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

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

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

 -1
Author: Artefacto, 2010-08-15 00:40:55