正则表达式:在HTML标记之间查找小写字母组

时间:2013-04-11 19:39:41

标签: html regex epub

我正在尝试开发一个可以在Sigil ePub 2编辑器中运行的正则表达式。

小型大写是当前ePub读者生态系统中众所周知的问题。许多读者,如Adobe Digital Editions,不支持“font-variant:small-caps”。在尝试了几种不同的解决方法之后,我决定通过将文本转换为大写并将之前的小写字母设置为“font-size:0.75em”来创建假小帽。

这个过程非常繁琐,尤其是在处理有大量尾注和其他书籍引用的书籍时。

假设我在标有“SC”类的HTML页面中有一堆短语。我创建了一个测试短语:

<span class="SC">Hello World! Testing: one tWo thrEE &amp; W.T.F.</span>
<span class="foo">Don't touch me!</span>

目标是编写一个仅与“SC”范围标记中的任何小写字母匹配的正则表达式,并将其替换为:

<span class="FSC">LETTERS</span>

我可以设法匹配并替换第一个单词“Hello”中的字母,但之后一切都会崩溃。

这是我到目前为止所得到的:

查找

(<span class="SC">.*?)([a-z]+)(.*</span>)

替换

\1<span class="FSC">\U\2\E</span>\3

然后,棘手的部分继续在该标签内找到其余的小写字母,现在已经引入了新的“FSC”(假小帽)跨度标签。再次尝试使用相同的正则表达式会导致“span”,然后“class”获得 FSC 处理。理想情况下,我希望能够继续点击“全部替换”按钮,直到找不到更多匹配项。

完成后,上面的示例如下所示:

<span class="SC">H<span class="FSC">ELLO</span> W<span class="FSC">ORLD</span>! T<span class="FSC">ESTING</span>: <span class="FSC">ONE</span> <span class="FSC">T</span>W<span class="FSC">O</span> <span class="FSC">THR</span>EE &amp; W.T.F.</span>
<span class="foo">Don't touch me!</span>

它不漂亮,但它适用于我测试过的每个ePub阅读器。

如果你谷歌“epub small caps regex”,你会看到我编辑的MobileRead wiki文章包含这个正则表达式,我认为这个文章并不令人满意:

(<span class="[a-zA-Z0-9\- ]*?(?<!F)SC[a-zA-Z0-9\-]*?">(?:.+?<span class="FSC">.+?</span>)*[\.|,|:|;|-|–|—|!|\?]? ?(?:&amp;)? ?[A-Z]+)([a-z'’\. ]+)(.*?</span>)

这最终会使一串标点符号小型化,有时会在短语中间停止。我重新开始,认为可能有一个更好的解决方案,不会尝试预先计划每一种可能性。

如果有人想出更好的解决方案,那么你将成为整个ePub出版业的英雄。

更新

我已将Mobile Read wiki的已接受(且唯一)答案添加到了{{3}}。请注意,此正则表达式已经过专门修改,可用于Sigil; YMMV在其他环境中。

1 个答案:

答案 0 :(得分:4)

完美的用例:Collapse and Capture a Repeating Pattern in a Single Regex Expression

根据您的情况修改它:

(<span class="SC">(?:(?!<\/span>)(?:[^a-z&]|&[^;]+;))*|(?!^)\G(?:(?!<\/span>)(?:[^a-z&]|&[^;]+;))*)([a-z]+)

替换为:\1<span class="FSC">\U\2\E</span>

以下是RegEx解释:http://regex101.com/r/jU6bA5

这是“全部替换”的解决方案,因为它通过RegEx全局修饰符/g起作用!