使用php计算html网页上的字数
我需要一个PHP脚本,它获取一个网页的URL,然后回显一个单词被提及的次数 例子 这是一个通用HTML页面:使用php计算html网页上的字数,php,html,scripting,bots,Php,Html,Scripting,Bots,我需要一个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 htmlur
<html>
<body>
<h1> This is the title </h1>
<p> some description text here, <b>this</b> is a word. </p>
</body>
</html>
<?php
htmlurl="generichtml.com";
the script here
echo(result);
?>
// 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
)
这类似于搜索机器人在网上冲浪时所做的事情,因此,您知道如何开始,或者更好,您是否有一个PHP脚本已经做到了这一点?从字符串中删除所有HTML标记后,下面的一行将进行不区分大小写的字数计算 要获取页面的源代码,可以使用或 由内而外:
1
返回一个数组,其中包含在字符串中找到的所有单词前面的代码是一个起点。下一步是使用正则表达式删除html标记。查找ereg和eregi函数。样式和脚本标记还需要一些其他技巧(您必须删除内容)
点和逗号也必须删除…下面的脚本将读取远程url的内容,删除html标记,并计算其中每个唯一单词的出现次数 警告:在您的预期输出中,“This”的值为2,但下面的值区分大小写,因此“This”和“This”都记录为单独的单词。如果原始大小写对您的目的不重要,您可以在处理之前将整个输入字符串转换为小写 此外,由于只在输入上运行一个基本的strip_标记,格式错误的标记将不会被删除,因此假设您的源html是有效的 编辑:Charlie在评论中指出,像
标题这样的内容仍将被计算在内。在中定义的函数的帮助下,现在也可以处理这些问题
// 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);
generichtml.com
<html>
<body>
<h1> This is the title </h1>
<p> some description text here, <b>this</b> is a word. </p>
</body>
</html>
// 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);
这是一项复杂的工作,你不应该独自尝试
您必须提取不属于标记/注释的文本,并且不是script
和style
等元素的子元素。为此,您还需要一个lax HTML解析器(如在libxml2中实现并在DOMDocument
中使用的解析器)
最后,在开始计算术语之前,你会对某种形式的术语感兴趣
我建议您为此使用专门的工具。我没有使用任何工具,但您可以尝试解析和标记化/词干分析(Lucene的目的是,但这些操作对于建立索引是必要的)。这是我计算包含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));
$sayilacak_-metin=str_-replace(“,”,$sayilacak_-metin);
$sayilacak_metin=preg_replace(“/]”*(这是一个干净的解决方案,但样式和脚本标记内容仍然存在。因此,应删除页面的所有标题。如果使用regExpressions,则无法分析无效的html代码;)标点仍然是一个问题。请不要使用正则表达式解析html。顺便说一句,strip_标记()(您使用的)已经删除了多行HTML注释和CDATA-。这是一项复杂的工作吗?ConroyP代码运行良好,并且完成了您列出的大部分内容。HTML具有非常规则的syntax@Charlie有太多的东西丢失了…处理非ASCII编码,正确处理HTML(我可以很容易地用圣经抄本构建一个HTML文档,这样他的代码就不会产生任何单词),一个合适的标记器(str\u word\u count
非常基本,只处理ASCII),一个词干分析器,…一个词干分析器?首先,为什么要添加一个无法找到每种语言根的词干分析器?(目的是什么?最初的问题要求的是一个简单的HTML解析器,而不是语言分析器)你可以为几种语言编写词干分析器。OP dind没有说他想要词干,但可以合理地假设他想要,特别是因为他的问题中已经有某种形式的术语规范化(“这个”和“这个”被视为相同).我想你也承认其他几点……是的,我的疑问仍然在词干分析器上。你在列表中表示的意大利语与30%的意大利语单词不匹配,它包含的词汇只占意大利语单词的1%(我不是开玩笑)。马丁·波特写了一个适合英语的算法(也许)但是对于其他更复杂的语言来说并不好。ereg
已经被弃用了,首先,正则表达式不是解析任意HTML的合适工具。如果perl O.O中存在正则表达式,怎么可能会被弃用呢?答案并不总是按时间顺序列出,所以前面的代码
不是很有帮助ink(每个答案都有一个唯一的答案)或author reference更好。正则表达式没有被弃用,只有ereg扩展。请改用PCRE(函数族preg)是的,但是关于script
和style
标签呢?@Yi Jiang-如果你想单独处理这些标签,很多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));