0

我有非常大的 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>

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

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

我想将类应用于段落(而不是制作标题 H1、H2 等)只是因为电子书阅读器(Kindle 等)可能会以不可预测的方式显示标题。文档编码为 utf-8,西里尔字符集。

4

4 回答 4

1

UltraEdit 中的正则表达式支持

编辑前的原始问题中提到的 UltraEdit v11.20 非常旧,不支持 Perl 语法中的正则表达式查找/替换,仅支持 UltraEdit 和 Unix 语法,其中 Unix 类似于 Perl,但其功能非常有限。

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

我不知道 UltraEdit 在 Mac 和 Linux 上使用 Perl 语法中的哪个正则表达式库。各种平台、各种版本的各种正则表达式库有很多共同点,当然也有区别。所以在复杂的 Perl 正则表达式查找/替换时,必须考虑平台和 UltraEdit 的版本以及所使用的正则表达式库的版本。在过去的 20 年里,所有版本的所有平台上的所有应用程序都使用的 Perl 正则表达式库不是一个也是唯一一个。

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

对于 Windows v11.20 的 UltraEdit 或任何更高版本的 UltraEdit 用于此任务的UltraEdit 正则表达式具有以下搜索和替换字符串,并在替换窗口中额外检查了匹配大小写:

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

这是 UltraEdit 语法中的标记表达式

它搜索<p>0 个或多个在任何情况下都不是 ASCII 字母或尖括号的字符,至少有 1 个大写 ASCII 字符,并且</p>必须找到除前面的小 ASCII 字母之外的 0 个或多个 ASCII 字符。第三个字符类期望<在段落文本中已经编码&lt;并且按照 HTML/XHTML 和 XML 标准的要求进行>编码。%gt;

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

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

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

其他大写字符(如德语字符ÄÖÜ)也可以添加到 3 个方括号内的字符类中。äöüß在这种情况下,还必须将小写语言特定字符(例如)添加到第一个字符类定义中,以排除它们以进行肯定匹配。

也可以使用负字符类代替正字符类,并检查选项匹配大小写

UltraEdit 语法示例:

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

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

使用更新版本的 UltraEdit 比 v11.20 更容易完成这项任务,因为 Perl 正则表达式引擎已根据 Unicode 定义为小写字符预定义了一个字符类,并为大写字符预定义了一个字符类。

使用 Perl 的 Unicode 解决方案

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

但并非所有版本中的所有 Perl 正则表达式库都可以支持如下所示的表达式。

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

UltraEdit for Windows 使用的Boost Perl 正则表达式库支持多个字符类。这里最有趣的是[:upper:]任何大写单词字符和[:lower:]任何小写字符。

Perl 正则表达式的示例:

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

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

\W是非单词字符的常见“单字符”字符类。

所有小写​​字符的“单个字符”字符类是\l. 并且\u是所有大写字符的“单字符”字符类。这些较短的字符类也可用于搜索字符串:

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

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

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

于 2016-07-23T18:47:45.030 回答
0

您可以使用以下样式

1.大写text-transform: uppercase;

2.小​​写text-transform: lowercase;

3.大写text-transform: capitalize;

输出

这是一些文字。

这是一些文字。

这是一些文本。

于 2016-07-21T13:32:27.577 回答
0

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

您可以添加 css-class 它将内部的任何文本转换为大写文本

.uppercase {
    text-transform: uppercase;
}

<p>你想要大写字母的地方。然后您可以进行任何其他操作,例如p.uppercase {color:red;} 在您的情况下p.uppercase.bold {...}


另一种方法是在这个答案中添加自定义 js 函数,以检查里面的文本<p>是否为大写。如果它是大写的,请添加您的自定义类。

$(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 示例


要使用正则表达式,请检查此答案Find largecase letters within <p></p> tags using regex

于 2016-07-21T13:34:53.217 回答
0

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

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

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

<p>
  UPPER  CASE  TEXT
</p>
于 2016-07-21T15:18:44.970 回答