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

标签 html regex epub

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

小型大写字母是当前 ePub 阅读器生态系统中的一个众所周知的问题。许多阅读器,例如 Adob​​e 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 标记中的任何小写字母,并将它们替换为:

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

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

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

查找:

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

替换:

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

棘手的部分是继续查找该标签中的其余小写字母,现在引入了新的“FSC”(假小型大写字母)span 标签。再次尝试相同的正则表达式会导致“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 .请注意,此正则表达式已专门更改为在 Sigil 中使用;其他环境中的 YMMV。

最佳答案

完美用例: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>

这是正则表达式的解释:http://regex101.com/r/jU6bA5

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

关于html - 正则表达式:查找 HTML 标记之间的小写字母组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15957420/

相关文章:

替换前面有空格的字符串

python - 使用 Python 从 epub 中提取文本

android - 如何从epub文件中阅读整章?

javascript - 网页中的非 Canvas 图形

javascript - Bootstrap Container 和 Container Fluid 有问题

java - 为什么这个正则表达式回溯不起作用

java - 如何使用 RegExp 替换除双引号之外的所有标点符号

html - 修复了 EPUB 布局,其中每个页面都有不同的大小

html - 从 HTML 表单发送电子邮件到我的电子邮箱

html - 显示:table-cell not working in IE11 only