2009-10-02 222 views
0

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

所有文字我想提取所有文字,在ALT属性,< p>标签等。

但是我不想提取风格之间的文本和脚本标签

感谢

现在我有以下代码

<?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标记

谢谢

+0

使用正则表达式来查找您的内容,而不是将其用于清理。 – jantimon 2009-10-02 08:16:35

+0

您是否有要从中提取文本的标签和属性的“白名单”,或者您不想从中提取文本的标签/属性的“黑名单”? – VolkerK 2009-10-02 08:27:42

+0

@Ghommey:谢谢我正在尝试,但它对我来说太难了 – ahmed 2009-10-02 08:40:36

回答

0

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

7

我个人认为你应该切换到某种XML读取器(SimpleXML,Document Object ModelXMLReader)来解析HTML文档。我会去的DOMSimpleXMLXPath混合提取你所需要的 - 解析任意文档时寄托都否则就会失败:

$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]'); 
// ... 
+0

我也会去这个解决方案。然而,如果HTML内容本身无效(破坏了标签等),它会中断。 – rubayeet 2009-10-02 08:33:08

+0

你是对的 - 但使用字符串和正则表达式函数构建一个解析器,可以处理任意和可能格式错误或无效的文档要复杂得多。 一种解决方案是在将HTML字符串传递给XML阅读器之前,通过HTML Tidy(http://de3.php.net/manual/en/book.tidy.php)运行HTML字符串。 如果OP将解析着名的结构化HTML(相同的结构所有tim),他应该可能去正则表达式解决方案。 – 2009-10-02 08:42:17

+0

@Stefan Gehrig:谢谢这样可以正常工作,但我会尽力知道如何获取所有文本,而不仅仅是“alt” - 它比正则表达式更容易和更安全 – ahmed 2009-10-02 08:47:55

0

首先,你可以搜索和块,并从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) 

一旦你的脚本和风格了,使用用strip_tags来获取文本

+0

这不会工作,除非你的脚本和样式标签使用95%的类型属性。 – 2009-10-02 08:39:29

+0

这是一个例子,你可以使用搜索(“”,$ html) – 2009-10-02 08:40:31

0

任何一种分析是不是一种选择,只要你不能确定来源是100%良好形成了XML(根据定义,HTML4不是)。

一个简单的preg_replace就足够了。类似于

preg_replace('/<(script|style).*>.*<\/\1>/i', '', $html); 

应该足以用空字符串替换所有脚本和样式元素及其内容(即剥离它们)。

但是,如果您想避免XSS攻击,那么最好使用HTML sanitiser来规范化HTML,然后去掉所有错误的代码。

0

我张贴这作为一个答案到另一个职位,但这里要再次重申:

我们刚刚在repustate.com推出了新的自然语言处理API了。使用REST API(所以只需使用curl就可以),你可以清理任何HTML或PDF,然后只取回文本部分。我们的API是免费的,因此可随意使用您的内容。检查一下,并将结果与​​readability.js进行比较 - 我想你会发现它们几乎是100%相同。

相关问题