2013-02-26 102 views
0

解析网页时,我的解析器停止由于无效的DOM结构。我想通过替换某个节点来修复它。preg_replace如果条件匹配

我发现有一个额外的</div>导致解析器停止。

我需要编写一个正则表达式,其将检查: 如果随后是</div> [即任何</div>没有起始<div>之间的标记。它将检查<div,因为该标签可能有id或class to follow],那么最后的</div>将被替换为<div></div>

即,如果</div>后面跟着</div>,则最后一个将被替换为<div></div>

在此先感谢。

例如: <div> <img src="/lexus-share/images/spacer.gif" width="2" height="15" border="0" alt=""> </div> <a href="http://www.somedomain.com"><img src="/pub-share/images.jpg"></a> </div>

+0

你可以A:提供一些代码与你的尝试和B:澄清你到底想要什么? – christopher 2013-02-26 13:30:09

+0

也许你可以编辑它到你的问题:) – christopher 2013-02-26 13:35:46

+0

所以你想要检查每个'

' has a '
'? – christopher 2013-02-26 13:37:37

回答

0

这只能如果没有嵌套<div>秒(不知道他们是合法的):

$result = preg_replace(
    '%</div>  # Match a closing div tag 
    (    # Match and capture in group 1... 
    (?:   # ...the following regex: 
     (?!</?div>) # Match (unless a div tag intervenes) 
     .   # any character. 
    )*   # Repeat any number of times. 
    )    # End of capturing group 
    (?=</div>)  # Assert that a closing div tag follows%six', 
    '</div><div>\1', $subject); 

这改变

<div> <img src="/lexus-share/images/spacer.gif" width="2" height="15" border="0" alt=""> </div> <a href="http://www.somedomain.com"><img src="/pub-share/images.jpg"></a> </div> 

<div> <img src="/lexus-share/images/spacer.gif" width="2" height="15" border="0" alt=""> </div><div> <a href="http://www.somedomain.com"><img src="/pub-share/images.jpg"></a> </div> 
0

我会建议你尝试一种不同的方法,而不是使用正则表达式,因为它不容易使它与嵌套标记一起工作。

我不知道你正在使用解析文档的语言,但你可以写代码的逻辑是:

通过解析整个文档搜索的字符串div>,使2个变量来算openingDivs和closingDivs。

如果div>之前的字符是<, openingDivs ++。

如果div>前性格/,closingDivs ++和检查if (closingDivs > openingDivs)

如果条件永远为真,则可以使程序输出的div的位置或用空格或空替换</div>

希望这会有所帮助。 :)