3

我正在寻求帮助来创建一个正则表达式来替换特定标记(例如<p>)中的所有最后一个空格&nbsp;。快速修复大量 html 文档中的所有寡妇。

例如;

    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus suscipit
    dolor a felis blandit sodales. Donec lectus justo, convallis vitae euismod sit.
    Nullam et tristique&nbsp;dui.</p> 
    <p>Nullam accumsan pellentesque pretium. Morbi tempor egestas lectus, 
    a eleifend enim aliquet varius. Vivamus vitae semper&nbsp;tortor.</p>

我在http://www.petefreitag.com/item/580.cfm找到了这个例子

ReReplace(text, " ([^ ]+\r?\n)", "&nbsp;\1", "ALL")

但它将它添加到每个元素的每个最后一个空格。

也感谢任何关于如何改进我写这个问题的建议会很棒

4

2 回答 2

2

这个问题比看起来要难一些,因为你可能有<p>没有单词的元素,只有一个单词,或者多个单词,或者在结束标记之前有很多空格</p>。您甚至可能在段落元素中嵌套了元素,从而使您认为可能是孤立词的内容根本不是孤立词。更复杂的是,在许多 HTML 版本中,结束标记</p>实际上是可选的。

由于这些原因,建议使用 HTML 解析器,而不仅仅是使用 regex 处理您的 HTML 文件

仅当您知道所有<p>元素都是封闭的,并且元素内没有嵌套元素<p>,并且所有<p>元素都有多个单词时,您才能摆脱替换

(\S)\s+(\S+)\s*</p>

\1&nbsp;\2</p>

如果您想保留结束标记之前的间距(如果您愿意),可以将最后一个括号括起来\s*并在替换字符串中添加一个。\3

不过,在没有 HTML 解析器的情况下做这样的事情之前我会小心。

于 2012-10-12T02:41:41.130 回答
0

假设您的 html 格式正确(很少见),并且不知道您使用的是什么语言,这是一个一般性的答案:

Regex: " (?= *</p>)"
Replacement text: "&nbsp;"

正则表达式匹配一个空格,但使用前瞻来断言匹配的空格后跟任意数量的 (0-n) 个空格,然后是您的目标标记。

于 2012-10-12T02:35:28.193 回答