0

我在 HTML 中有多个嵌套引号,如下所示:

<div class="quote-container">
   <div class="quote-block">
      <div class="quote-container">
         <div class="quote-block">
         </div>
      </div>
      <div class="quote-container">
         <div class="quote-block">
         </div>
      </div>
      <div class="quote-container">
         <div class="quote-block">
         </div>
      </div>
   </div>
</div>

我需要搜索和删除引号。我使用表达式:

<div class="quote-container">.*<div class="quote-block">.*</div>.*</div>

这适用于单引号。但是,多嵌套引号存在问题(上面的示例)。

我的任务是搜索:

<div class="quote-container">.*<div class="quote-block">

加上任何不包含的字符串

<div

并以

.*</div>.*</div>

我尝试了像这样的lookbehind和lookahead断言:

<div class="quote-container">.*<div class="quote-block">.*(?!<div).*</div>.*</div>

但他们不工作。

有没有办法完成我的任务?我需要一个可以在 TextPipe 中使用的 perl 表达式(我将它用于论坛解析,然后我进行文本到语音的转换)。

提前致谢。

4

3 回答 3

0

正则表达式是操作嵌套结构的糟糕选择。我会为这个问题编写一个特定的解析器(一个简单的基于堆栈的解析器就足够了)。

于 2012-06-26T19:31:08.927 回答
0

我认为您的问题是您正在使用贪婪的表达式.*

尝试用.*非贪婪替换所有.*?

于 2012-06-26T18:50:47.350 回答
0

我个人会通过替换引号来解决这个问题,直到不再有任何引号可以替换为止。真的没有办法在一个正则表达式替换中处理这个问题,你需要做的是:

伪代码:

html="... from your post ...";
do{
 newhtml=html
 newhtml=replace(
        '/<div class="quote-container">.*<div class="quote-block">.*</div>.*</div>/s',
        '',
        newhtml
    )
} while(newhtml!=html)
html=newhtml

这将处理各种嵌套引号。

于 2012-06-26T18:55:23.560 回答