如何使用PHP从HTML文件中提取所有文本?
如何从HTML文件中提取所有文本 我想提取alt属性、标记等中的所有文本 但是,我不想提取样式和脚本标记之间的文本 谢谢 现在我有以下代码如何使用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
<?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%的类型属性一样,否则这将不起作用。这是一个示例,您可以使用搜索(“