0

在解析网页时,我的解析器由于无效的 DOM 结构而停止。我想通过替换某些节点来修复它。

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

我需要编写一个正则表达式来检查: if any</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>

4

2 回答 2

0

我建议您为此尝试一种不同的方法,而不是使用正则表达式,因为使用嵌套标签并不容易。

我不知道您使用什么语言来解析文档,但是您可以编写的代码逻辑是:

解析整个文档以搜索字符串div>并创建 2 个变量来计算 openingDivs 和 closingDivs。

如果之前的字符div><,则打开Divs++。

如果之前的字符div>/,则关闭Divs++ 并检查if (closingDivs > openingDivs)

如果条件成立,您可以让程序输出 div 的位置或</div>用空格或 null 替换。

希望这可以帮助。:)

于 2013-02-26T13:55:08.390 回答
0

这仅在没有嵌套<div>s 时才有效(不确定它们是否合法):

$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>
于 2013-02-26T13:40:03.780 回答