使用php计算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

我需要一个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
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("&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));
    
    $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("&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));