【问题标题】:Matching two sections same number of times匹配两个部分的次数相同
【发布时间】:2011-06-01 13:07:07
【问题描述】:

我正在寻找代码来解析以下内容:

一些文本文本

我需要删除不必要的 <span> 出现,这样输出是:

一些文本文本

我写了一个正则表达式,它做了一次:

/[^/i

如何在<span></span> 上使这项工作的次数相同?

【问题讨论】:

  • 第n次:正则表达式不用于解析HTML!
  • 我不认为用正则表达式可以做到,我认为语法至少是上下文无关的。
  • @progo:更像是“第 n^1000 次”……
  • @progo:也许最好说:清理 HTML 而不是解析。任何人有更好的解决方案来清理 Microsoft Word 生成的 HTML?

标签: regex preg-replace pcre


【解决方案1】:
$result = preg_replace(
    '%(?<=<span>)        # Assert that there is a directly preceding span tag
    <span>               # Match a span tag
    ((?:(?!</?span>).)*) # Match the contents of the tag only if they do not include another span tag
    </span>              # Match a closing span tag
    (?=</span>)          # Assert that there is a directly following span tag
    %six', 
    '\1', $subject);

将适用于您的示例,但它必须应用两次,因为它会在每次迭代中删除嵌套的 span 标签的一个“层”。

因此,对于任意嵌套的标签,您需要为每个嵌套级别调用一次。

【讨论】:

  • 嗯,这看起来像是我需要的答案。但是,我在测试时遇到连接中止错误(我只添加了 /i 修饰符,没有其他更改)。
  • 嗯,不知道这个错误是什么意思。您确实意识到在这个正则表达式中,分隔符是%,而不是/ 字符,所以如果您添加/i,您会引入错误吗?我现在已经编辑了我的正则表达式,使其不区分大小写。
  • 就是这样,谢谢。看起来它破坏了我的 Windows 服务器,但可以在 linux 和 Windows CLI 上运行。
【解决方案2】:

您可以尝试查看&lt;span&gt; 后面是否直接紧跟另一个&lt;span&gt; 并且其匹配的&lt;/span&gt; 直接由另一个&lt;/span&gt; 前置。

但您实际上不能说该跨度将毫无用处,因为可以将标记添加到这些特定跨度。如果没有任何标记,那么最后剩下的跨度也是无用的,也可能被删除。

【讨论】:

    猜你喜欢
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    相关资源
    最近更新 更多