2011-09-02 157 views
1

可能重复:
Best methods to parse HTML with PHP正则表达式匹配的表行

我有一点匹配表中的行与预浸麻烦。这里是我的表达:(包括所有的符号)

<TR[a-z\=\"a-z0-9 ]*>([\{\}\(\)\^\=\$\&\.\_\%\#\!\@\=\<\>\:\;\,\~\`\'\*\?\/\+\|\[\]\|\-a-zA-Z0-9À-ÿ\n\r ]*)<\/TR> 

正如你所看到的,它试图马赫一切都在两者之间TR标记,部分有多个表中的行打交道时的伟大工程,但是,往往需要多个表行作为一个匹配,而不是匹配每个表行:

<TR> 
<TD>test</TD> 
</TR> 
<TR> 
<TD>test2</TD> 
</TR> 

产量:

Array 
    (
     [0] => <TD>test</TD> 
       <TD>test2</TD> 
    ) 

而不是我希望它:

Array 
    (
     [0] => <TD>test</TD> 
     [1] => <TD>test2</TD> 
    ) 

我意识到这样做的原因是因为它符合符号,并且搜索自然需要其余的行,直到它碰到最后一个。

所以基本上,我想知道是否有人可以帮助我添加表达式,以便在TR标签之间排除任何带有“TR”的内容,以防止它匹配多行。

+1

*(相关)* [最佳解析方法](http://stackoverflow.com/questions/3577641/best-methods-to-parse-html/3577662#3577662) – Gordon

+1

您有选择使用一个PHP的HTML解析器,而不是正则表达式? – Chandu

+1

而不是手动任何:有PHP的现成的HTML表提取库。 – mario

回答

2

尝试使用全局搜索:

preg_match_all("/<td>([^<]+)/", $html, $matches);

+0

这几乎可以工作,但是我需要在标签之间的所有内容,而不仅仅是来自td标签的单个项目。从表达式中的“[^ <]”排除“<”,而不是排除字符串“TR”或者甚至“”? – user925996

+0

尝试设置'sim'标志并用'tr'替换正则表达式中的'td': '/ ([<] +)/ sim' – Kakashi

2

使用延迟匹配在您正则表达式:<tr.*?</tr>

但正如其他人所说的,这是更强大的,如果你能使用合适解析器。

+0

我尝试过简单的html解析器和ganon,但都失败了,必须解析。 – ravisoni