2010-12-22 50 views
2

我有一个PHP程序,在某些时候需要分析大量HTML + JavaScript文本来解析信息。 我想解析的所有内容都需要分成两部分。改进正则表达式,以便尽可能高效

  1. 独立所有的 “HTML goups” 解析
  2. 解析HTML各组获得所需要的信息。

在第1解析它需要找到:

<div id="myHome" 

,并启动标记后捕获。然后停止捕获

<span id="nReaders" 

并捕获此标记后停止的数字。

在第二次解析中,使用捕获nº1(0具有全部东西,2具有数字),然后找到 。

我已经有代码来做到这一点,它的工作原理。有没有办法改善这一点,使机器更容易解析?

preg_match_all('%<div id="myHome"[^>]>(.*?)<span id="nReaders[^>]>([0-9]+)<"%msi', $data, $results, PREG_SET_ORDER); 
foreach($results AS $result){ 
    preg_match_all('%<div class="myplacement".*?[.]php[?]((?:next|before))=([0-9]+).*?<tbody.*?<td[^>]>.*?[0-9]+"%msi', $result[1], $mydata, PREG_SET_ORDER); 
//takes care of the data and finish the program 

注:我需要这样一个免费的程序,所以它必须是尽可能通用,如有可能,不要使用PHP扩展

地址: 我这里ommitted一些地方,因为我没有期待像这样的答案。 还需要解析文档中的其中一个标签内的文本。它可能是第6个第7或第8个标签,但我知道它是在某个标签之后。我查过的解析器(thx profitphp)确实可以找到脚本标签。现在怎么办? 同一班级有超过1个标签。我想要他们。但我只想要也是类列表中的一个...... 我在哪里可以找到DOM解析器的指令和演示以及局限性(如http://simplehtmldom.sourceforge.net/中的那个)?我需要一些能够工作的东西,至少有大量的免费服务器。 另一件事。如何解析这部分: “php?=([0-9] +)” 与那些HTML解析器?

+6

这个问题听起来更适合[html parser](http://stackoverflow.com/questions/292926/robust-mature-html-parser-for-php)。请参阅[答案](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags),它解释了原因。 – marcog 2010-12-22 19:44:11

+4

作为一般规则,[不要使用正则表达式来解析HTML](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 )。 – lonesomeday 2010-12-22 19:45:36

+2

恩,日常“如何滥用html解析正则表达式”线程。 – cbrandolino 2010-12-22 19:47:20

回答

1

如上所述,正则表达式不适合这一点。你会使用somethign像这样的好:

Robust and Mature HTML Parser for PHP

+0

这里出现的html解析器看起来很有用,似乎与我的正则表达式的一部分一起工作。解析标签中的代码? – brunoais 2010-12-22 21:41:24

0

效率,如果你的结果是不正确无关紧要。用正则表达式解析HTML会导致错误的结果。使用解析器。

0

我找到了一种创建高效搜索的方法。

如果你想“在整个文本一个巨大的字符串”来搜索,你可以这样来做:

(?:(?:[^A]*A)+? huge string in a whole text) 

它总是工作。只为每个“A”字符创建一个回溯,而不是针对每个单个字符。正因为如此,它不仅内存高效,而且处理能力也很高。如果有两个选项,它也可以毫无问题地工作:

(?:(?:[^AB]*AB)+?(?: huge string in a whole text|e the huge string in a whole text)) 

直到现在它从未失败。