Мне нужен Сценарий 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
возвращает массив, содержащий все слова, найденные в строке. Приведенный ниже сценарий будет читать содержимое удаленного 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
)
Предыдущий код - это точка начала. Следующим шагом будет удаление тегов html с регулярными выражениями. Ищите функции ereg и eregi. Для тегов стилей и скриптов требуются другие хитрости (содержимое необходимо удалить) Очки и запятые тоже нужно убрать ...
Это сложная работа, которую не следует выполнять в одиночку.
Вы должны извлечь текст, который не является частью тегов / комментариев и не является дочерним для таких элементов, как скрипт
и стиль
. Для этого вам также понадобится слабый анализатор HTML (например, реализованный в libxml2 и используемый в DOMDocument
.
Затем вы должны токенизировать текст, который представляет его собственные проблемы. Наконец, вы бы заинтересовались некоторой формой стемминга , прежде чем переходить к подсчету терминов.
Я рекомендую вам использовать для этого специальные инструменты. Я не использовал ни один из них, но вы можно попробовать HTMLParser для синтаксического анализа и Lucene для токенизации / стемминга (цель Lucene - Text Retrieval , но эти операции необходимы для построения индекса).