Подсчет слов на веб-странице 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 answers
В одной строке ниже будет указано количество слов без учета регистра после удаления всех HTML-тегов из вашей строки.
Живой Пример
print_r(array_count_values(str_word_count(strip_tags(strtolower($str)), 1)));
Чтобы получить исходный код страницы, вы можете использовать Завиток или файл_гет_контенты()
$str = file_get_contents('http://www.example.com/');
Изнутри наружу:
- Использовать стратолауэр() чтобы все было в нижнем регистре.
- Удалите HTML-теги с помощью теги strip_tags()
- Создайте массив слов, используемых с помощью str_word_счет(). Аргумент
1
возвращает массив, содержащий все слова, найденные внутри строки. - Использовать array_count_значения() для захвата слов, используемых более одного раза, путем подсчета встречаемости каждого значения в вашем массиве слов.
- Использовать печать_r() для отображения результатов.
Приведенный ниже скрипт прочитает содержимое удаленного 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
)
Предыдущий код - это точка, с которой начинается. Следующий шаг - удалить html-теги с регулярными выражениями. Ищите функции ereg и eregi. Для тегов стилей и сценариев требуются некоторые другие приемы (вам необходимо удалить содержимое) Точки и запятые тоже должны быть удалены...
Это мой код для подсчета слов, содержащих html-теги:
$sayilacak_metin = str_replace(" ", " ", $sayilacak_metin);
$sayilacak_metin = preg_replace("/<([^>]*(<|$))/", "<$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: Подсчет отфильтрованного массива
Это сложная работа, которую вы не должны выполнять самостоятельно.
Вам необходимо извлечь текст, который не является частью тегов/комментариев и не является дочерним для таких элементов, как script
и style
. Для этого вам также понадобится синтаксический анализатор HTML (например, реализованный в libxml2 и используемый в DOMDocument
.
Затем вам нужно обозначить текст, который представляет свои собственные проблемы. Наконец, вас заинтересует некоторая форма вывода , прежде чем приступить к подсчету условия.
Я рекомендую вам использовать для этого специализированные инструменты. Я не использовал ни один из них, но вы можете попробовать HTMLParser для синтаксического анализа и Lucene для токенизации/вывода (цель Lucene - Извлечение текста, но эти операции необходимы для построения индекса).