如何使用PHP从HTML文件中提取所有文本?

如何使用PHP从HTML文件中提取所有文本?,php,html,regex,parsing,html-content-extraction,Php,Html,Regex,Parsing,Html Content Extraction,如何从HTML文件中提取所有文本 我想提取alt属性、标记等中的所有文本 但是,我不想提取样式和脚本标记之间的文本 谢谢 现在我有以下代码 <?PHP $string = trim(clean(strtolower(strip_tags($html_content)))); $arr = explode(" ", $string); $count = array_count_values($arr); foreach($count as $valu

如何从HTML文件中提取所有文本

我想提取alt属性、标记等中的所有文本

但是,我不想提取样式和脚本标记之间的文本

谢谢

现在我有以下代码

    <?PHP
    $string =  trim(clean(strtolower(strip_tags($html_content))));
    $arr = explode(" ", $string);
    $count = array_count_values($arr);
    foreach($count as $value => $freq) {
          echo trim ($value)."---".$freq."<br>";
    }

    function clean($in){
           return preg_replace("/[^a-z]+/i", " ", $in);
    }

    ?>

这很好用,但它可以检索我不想检索的脚本和样式标记 另一个问题是,我不确定它是否会检索像alt这样的属性,因为strip_tags函数可能会删除所有带有属性的HTML标记


谢谢

首先删除包含完整内容的脚本和样式标记,然后使用当前清理标记的方法,您将获得文本。

我个人认为您应该切换到某种类型的XML读取器(,或)来解析HTML文档。我会选择混合使用
DOM
SimpleXML
,并提取您需要的内容-在解析任意文档时,所有其他内容都会失败:

$dom = new DOMDocument();
$dom->loadHTML($html_content); // use DOMDocument because it can load HTML
$xml = simplexml_import_dom($dom); // switch to SimpleXML because it's easier to use.
$pTags = $xml->xpath('/html/body//p');
$tagsWithAltAttribute = $xml->xpath('/html/body//*[@alt]');
// ...

首先,您可以搜索和块,并将它们从html中删除

我有这个功能,我经常使用

        function search($start,$end,$string, $borders=true){
            $reg="!".preg_quote($start)."(.*?)".preg_quote($end)."!is";
            preg_match_all($reg,$string,$matches);

            if($borders) return $matches[0];    
            else return $matches[1];    
        }
该函数将返回数组中的匹配块

$array = search("<script>" , "</script>" , $html)
$array=search(“,”,$html)

脚本和样式消失后,使用strip_标记获取文本

任何类型的解析都不是选项,只要您不能确保源是100%格式良好的XML(根据定义,HTML4不是)

一个简单的preg_替换就足够了。差不多

preg_replace('/<(script|style).*>.*<\/\1>/i', '', $html);
preg_replace('/.*/i',''$html);
应该足以用空字符串替换所有脚本和样式元素及其内容(即剥离它们)


但是,如果您想避免XSS攻击,您最好使用HTML消毒剂对HTML进行规范化,然后去除所有错误代码。

我将此作为另一篇文章的答案发布,但这里再次说明:


我们刚刚在上发布了一个新的自然语言处理API。使用RESTAPI(所以只需使用curl就可以了),您可以清除任何HTML或PDF,只返回文本部分。我们的API是免费的,所以可以随心所欲地使用。查看并将结果与readability.js进行比较-我想你会发现它们几乎100%相同

使用正则表达式查找您的内容,而不是将其用于清理。您是否有要从中提取文本的标记和属性的“白名单”或“黑名单”您不想从中提取文本的标记/属性的数目?@Ghommey:谢谢,我正在尝试,但对您来说太难了me@VolkerK当前位置我不知道所有这些,但我提到了其中一些,-黑名单和白名单-我的目标是创建一个搜索引擎,所以我想提取文档中的所有文本,使我的搜索引擎搜索文本我也会选择这个解决方案。但是,如果HTML内容本身无效(有损坏的标记等),它将崩溃。你是对的,但是使用字符串和正则表达式函数构建一个解析器,可以处理任意的、可能格式错误或无效的文档,这将非常复杂。一种解决方案是在将HTML字符串传递给XML读取器之前,通过HTMLtidy()运行HTML字符串。如果OP将解析众所周知的结构化HTML(所有时间都是相同的结构),他可能会选择正则表达式解决方案。@Stefan Gehrig:谢谢,这会很好,但我将尝试了解如何获取所有文本,不仅仅是“alt”-它比常规表达式更简单、更安全,除非您使用的是XHTML(由于各种原因,这是一个坏主意)或与XHTML兼容的HTML(这几乎毫无意义),文档永远不会是格式良好的XML(除非源代码不包含元标记、链接、图像…)。如果你需要那种清洁度,最好使用一种全面的HTML消毒剂。@Alan:这就是为什么我们使用
DOMDocument::loadHTML()
method。它可以处理纯HTML,不需要XHTML来构建DOM树。但是它不能处理无效的HTML文档…除非脚本和样式标记使用类型属性,就像95%的类型属性一样,否则这将不起作用。这是一个示例,您可以使用搜索(“