如何将样式应用于所有大写文本的段落?

How to apply style to all paragraphs with upper case text?

我有非常大的 HTML 文档,包含大量段落。对于标题,在段落中使用大写文本。

如何找到所有包含大写文本的段落并将样式应用于这些段落?

大多数段落中的文本之间也有很多额外的间距。现有标题示例:

<p>                                                   </p>
<p>                      USU EA EUISMOD HONESTATIS DETERRUISSET.</p>
<p>Qualisque mnesarchum no nam, usu cu fastidii delicata. Eu mei nonumy libris, quas movet vivendo vim at. Prima epicuri conceptam pro ad, in suas nonumes similique duo. Qui mundi essent complectitur eu. Ei laudem veritus democritum vis, te ferri appareat eos. Ceteros pertinacia ea eum, quo integre theophrastus ex, eum et sint omnes detracto. Ea vim brute labore. Vim te esse libris erroribus, ex minimum tacimates dissentiet duo. Ignota iisque in mei, pri sanctus albucius omnesque id. Laoreet docendi theophrastus ei pri, duo wisi tollit decore ea, tempor doctus vivendo sed ad. </p>
<p>Usu ea euismod honestatis deterruisset. Ne quo malis meliore, duo viris liberavisse no, mea an vide mutat quodsi. Vis an vidit debitis, et noster aliquam pri, case iudicabit te sea. Cum sadipscing consectetuer cu, an nominavi consulatu adversarium sea, nam ad dico evertitur voluptaria. Id justo viderer bonorum per, in ius impedit tincidunt, nec et quis scaevola. Cu congue iriure scaevola usu. Ei elit reformidans suscipiantur eos, cum ut doming iracundia.  </p>
<p>                                                                             </p>
<p>                       CU CONGUE IRIURE SCAEVOLA   --
   UT DOMING IRACUNDIA. </p>
<p>                                  DICO TEMPOR HABEMUS.</p>
<p>Homero everti ei nam. An liber euripidis vis, pericula persecuti deseruisse ad mea. Dicant offendit sea et, per esse timeam deserunt ut. In pri enim sadipscing, ei movet soleat suavitate vim. Mea et omnesque phaedrum, paulo luptatum concludaturque vim ea. -- LIBER. </p>

我想对段落标签内的大写文本(标题)应用样式,使它们成为粗体(标题)。

在 运行 正则表达式替换或 UltraEdit 宏之后,上面的块应该如下所示:

<p>                                                   </p>
<p class="bold">                      USU EA EUISMOD HONESTATIS DETERRUISSET.</p>
<p>Qualisque mnesarchum no nam, usu cu fastidii delicata. Eu mei nonumy libris, quas movet vivendo vim at. Prima epicuri conceptam pro ad, in suas nonumes similique duo. Qui mundi essent complectitur eu. Ei laudem veritus democritum vis, te ferri appareat eos. Ceteros pertinacia ea eum, quo integre theophrastus ex, eum et sint omnes detracto. Ea vim brute labore. Vim te esse libris erroribus, ex minimum tacimates dissentiet duo. Ignota iisque in mei, pri sanctus albucius omnesque id. Laoreet docendi theophrastus ei pri, duo wisi tollit decore ea, tempor doctus vivendo sed ad. </p>
<p>Usu ea euismod honestatis deterruisset. Ne quo malis meliore, duo viris liberavisse no, mea an vide mutat quodsi. Vis an vidit debitis, et noster aliquam pri, case iudicabit te sea. Cum sadipscing consectetuer cu, an nominavi consulatu adversarium sea, nam ad dico evertitur voluptaria. Id justo viderer bonorum per, in ius impedit tincidunt, nec et quis scaevola. Cu congue iriure scaevola usu. Ei elit reformidans suscipiantur eos, cum ut doming iracundia.  </p>
<p>                                                                             </p>
<p class="bold">                       CU CONGUE IRIURE SCAEVOLA   --
   UT DOMING IRACUNDIA. </p>
<p class="bold">                                  DICO TEMPOR HABEMUS.</p>
<p>Homero everti ei nam. An liber euripidis vis, pericula persecuti deseruisse ad mea. Dicant offendit sea et, per esse timeam deserunt ut. In pri enim sadipscing, ei movet soleat suavitate vim. Mea et omnesque phaedrum, paulo luptatum concludaturque vim ea. -- LIBER. </p>

由于某些段落包含 mixed 大写和小写文本,我们需要限制正则表达式以仅搜索包含 all 大写文本的段落, 没有小写字母。段落内也可以有换行符。

如何在 Linux 的 UltraEdit 中使用一些宏或代码来完成此操作? (或者 Windows 版本作为正则表达式无论如何都是相同的。)

我想将 class 应用于段落(而不是使 headers H1、H2 等)只是因为电子书阅读器(Kindle 等)可能会在中显示 headers不可预知的方式。 文档编码为utf-8,西里尔字符集。

您可以使用以下样式

1.uppercase text-transform: uppercase;

2.lowercase text-transform: lowercase;

3.capitalize text-transform: capitalize;

输出

这是一些文字。

这是一些文字。

这是一些文本。

接下来是我想到的最简单也是第一个解决方案:

您可以添加 css-class,这会将里面的任何文本转换为大写文本

.uppercase {
    text-transform: uppercase;
}

<p> 您需要大写字母的位置。 然后你可以做任何其他操作,比如 p.uppercase {color:red;} 在你的情况下它将是 p.uppercase.bold {...}


另一种方法是像 this answer 一样添加自定义 js 函数来检查 <p> 中的文本是否为大写。 如果是大写,请添加您的自定义 class.

$(function(){
  var arrP = $('p'); //get all p-elements
  if(arrP.length > 0){ //check if there are some p-elements
     for(var i=0; i<arrP.length; i++){ 
     if(isUpperCase(arrP[i].text())){ // if p-text in in UPPERCASE
        arrP[i].addClass('.bold');    // add class bold
     }
  }
}

JSFiddle Example


要使用 Regex,请查看此答案 Find uppercase letters within <p></p> tags using regex

使用 vim 编辑器,您可以使用以下命令完成此操作:

:g/<p>[A-Z ]\{-}<\/p>/ s/\s\{2,}/ /g | s/<p>/<p class="bold">/g

注意 如果您的 <p> 标签跨越多行,它就不起作用,例如:

<p>
  UPPER  CASE  TEXT
</p>

UltraEdit 中的正则表达式支持

编辑前原问题中提到的UltraEdit v11.20很旧,不支持Perl语法中的正则表达式finds/replaces,只是在UltraEdit和Unix语法中,Unix类似于Perl,但非常能力有限。

2006 年 3 月 15 日发布的 Windows v12.00 的 UltraEdit 引入了对 Perl 正则表达式 finds/replaces 的支持。 UltraEdit 的 Perl 正则表达式支持有许多次要更新和一些主要更新。次要更新是错误修复。例如,UE v19.00 和 UE v21.20 中的主要更新引入了嵌入在 UltraEdit 中的更新版本的 Boost 正则表达式库,用于 Windows 并增强了正则表达式引擎本身。

我不知道UltraEdit在Mac和Linux上使用了哪个Perl语法正则表达式库。各种平台、各种版本的各种正则表达式库有很多共同点,当然也有不同之处。因此,对于复杂的Perl正则表达式,必须考虑平台和UltraEdit版本分别使用的正则表达式库的版本finds/replaces。没有一个Perl正则表达式库是近20年来所有平台所有版本所有应用程序都使用的。

字符集(代码页)取决于解决方案

使用 UltraEdit for Windows v11.20 或任何更高版本的 UltraEdit 用于此任务 UltraEdit 正则表达式 with以下搜索和替换字符串 Match Case 另外检查了替换 window:

查找内容:<p^(>[~A-Za-z<>]++[A-Z][^t^r^n -`{-~]++</p>^)
替换为:<p class="bold"^1

这是 UltraEdit 语法中的 tagged expression

它搜索 <p> 包含 0 个或更多字符,在任何情况下都不是 ASCII 字母或尖括号,至少有 1 个大写 ASCII 字符,并且有 0 个或更多 ASCII 字符,除了必须找到 </p> 之前的小 ASCII 字母。第三个字符 class 预计段落文本中的 < 已经用 &lt; 编码,并且 > 根据 [=127 的要求用 %gt; 编码=] 和 XML 标准。

第三个字符class[^t^r^n -`{-~]包含两个不常见的字符范围定义,需要了解ASCII table中的字符。第一个是从 space 到重音符号,其中包括许多常用的标点符号,数字 0-9 和大写 ASCII 字母,第二个是从左大括号到波浪字符,包括其他非ASCII 字符范围内的单词字符。

相同的正则表达式替换为Unix/Perl语法:

查找内容:<p(>[^A-Za-z<>]*[A-Z][\t\r\n -`{-~]*</p>)
替换为:<p class="bold"

其他大写字符,如德语字符 ÄÖÜ 也可以添加到 3 个方括号内的字符 classes 中。在这种情况下,还必须将 äöüß 等小写语言特定字符添加到第一个字符 class 定义中,以将它们排除在正匹配项之外。

也可以使用负字符 class 代替正字符 class 并选中选项 匹配大小写

UltraEdit 语法示例:

查找内容:<p^(>[~A-Za-z<>ÄÖÜäöüß]+[A-ZÄÖÜ][~a-z<>äöüß]++</p>^)
替换为:<p class="bold"^1

这样做的好处是,除了负字符 classes 中指定的小写字符和尖括号之外的所有字符都被解释为标题的有效字符,该标题包括来自上半部分的许多字符使用的字符集/代码页。

如果使用比 v11.20 更新的 UltraEdit 版本,此任务会更容易,因为 Perl 正则表达式引擎根据 Unicode 为小写字符预定义了一个字符 class,为大写字符预定义了一个字符定义。

使用 Perl 的 Unicode 解决方案

不依赖于本地字符集/代码页的解决方案需要 Perl 正则表达式替换,因为根据 Unicode 标准使用字符定义。

但并不是所有版本的所有Perl正则表达式库都支持下面写的表达式。

发布的 Perl 正则表达式已使用 UltraEdit 测试 Windows v22.20.0.49(最后 public 版本的 UE for Windows XP)和 v23.20.0.28 ( Windows Vista 及更高版本 Windows) 的当前最新版 UE。

Boost Perl regular expression library used by UltraEdit for Windows supports several character classes。这里最有趣的是 [:upper:] 表示任何大写单词字符,[:lower:] 表示任何小写字符。

Perl 正则表达式示例:

查找内容:<p(>\W*?[[:upper:]][^[:lower:]]+?</p>)
替换为:<p class="bold"

查找内容:<p(>\W*?[[:upper:]][[:upper:]\W]*?</p>)
替换为:<p class="bold"

\W是一个普通的"single character"字符class表示非单词字符

所有小写字符的 "single character" 字符 class 是 \l\u 是所有大写字符的 "single character" 字符 class。那些较短的字符 classes 也可以用于搜索字符串:

查找内容:<p(>\W*?\u[^\l]+?</p>)
替换为:<p class="bold"

查找内容:<p(>\W*?\u[\u\W]*?</p>)
替换为:<p class="bold"

此处发布的所有表达式都确保该段落至少包含 1 个大写字符。