AppleScript 用字符替换 HTML 字符串中的所有 HTML 字符代码

问题描述 投票:0回答:1

我正在将 html 文本转换为纯文本,需要将 HTML 字符代码替换为代码代表的实际字符。

以下示例代码对两个字符代码执行此操作,但每个字符代码需要单独的一行。

有没有一种方法可以替换所有这些而不用硬编码每个字符代码?


set theText to replaceText("&", "&", theText)
set theText to replaceText(" ", " ", theText)

on replaceText(find, replace, textString)
    set prevTIDs to AppleScript's text item delimiters
    set AppleScript's text item delimiters to find
    set textString to text items of textString
    set AppleScript's text item delimiters to replace
    set textString to "" & textString
    set AppleScript's text item delimiters to prevTIDs
    return textString
end replaceText
html replace applescript
1个回答
0
投票

这在很大程度上取决于您所说的“无需对每个字符代码进行硬编码”的含义以及您将使用的现实世界文本。 @red_menace 的

textutil
建议非常好。
textutil
命令预先安装在
/usr/bin
中,并且可以通过
do shell script
与 AppleScript 一起使用。

例如:

set theText to "These donuts & pastries include some éclairs."
set theText to do shell script "/usr/bin/textutil -stdin -stdout -format html -convert txt <<< " & quoted form of theText

选项按顺序为:

  1. -stdin
    :这告诉
    textutil
    不要从文件获取输入,而是从标准输入接受输入,这就是 AppleScript 发送它的方式。这与您在命令行上将文本从一个命令“管道”到另一个命令相同。
  2. -stdout
    :这告诉
    textutil
    ,不要将其输出打印到文件,而是将其输出打印到标准输出,这就是 AppleScript 期望的发送方式。
  3. -format html
    :这告诉
    textutil
    将其输入解释为 HTML。这是告诉它寻找
    &nbsp;
    &amp;
    等实体所必需的。
  4. -convert txt
    :这告诉
    textutil
    将其输入转换为文本。这样,当它查找
    &amp;
    时,它会将其转换为
    &

三个左尖括号是管道文本的一种方式。

如果我在任意输入文本上运行它

These donuts &amp; pastries include some &eacute;clairs.
我最终会得到:

这些甜甜圈和糕点包括一些闪电泡芙。

如果您希望在 AppleScript 中执行完整转换,确实没有直接的方法。

  1. 很可能有一种方法可以通过
    use framework "Foundation"
    来做到这一点,但这不是我熟悉的东西。
  2. 您可能还会发现使用 Automator 创建快速操作是一种更可靠的方法来完成您想做的事情。

但是,在 AppleScript 中进行此类转换的一种方法是,将实体放置在制表符分隔的文件中,其方式与示例代码类似但硬编码较少。可以使用任何实体列表来构建这样的文件。这是一个简单的文件:

amp[tab]&
nbsp[tab][ ] 
eacute[tab]é

[tab]
替换为制表符,并将
[ ]
替换为空格(或不间断空格)。

使用此文件的 AppleScript 可能如下所示:

property codeFile : POSIX file "/Users/USER/PATH/TO/codes.txt"

set theText to "These donuts &amp; pastries include some &eacute;clairs."
    
set AppleScript's text item delimiters to tab
repeat with codeLine in paragraphs of (read codeFile as «class utf8»)
    if (count codeLine) is greater than 1 then
        set theCode to text item 1 of codeLine
        set theCharacter to text item 2 of codeLine
        set theCode to "&" & theCode & ";"
        set theText to replaceText(theCode, theCharacter, theText)
    end if
end repeat
theText

on replaceText(find, replace, textString)
    set prevTIDs to AppleScript's text item delimiters
    set AppleScript's text item delimiters to find
    set textString to text items of textString
    set AppleScript's text item delimiters to replace
    set textString to "" & textString
    set AppleScript's text item delimiters to prevTIDs
    return textString
end replaceText

如您所见,它逐字使用您的

replaceText
处理程序。它执行的转换与
textutil
执行的转换相同,尽管速度要慢得多且通用性较差。根据文本的大小,这可能是也可能不是问题。

它计算每一行中的字符,因为最后一行通常是空行(或除行分隔符之外的空行)。它以与

replaceText
处理程序相同的方式操作文本项分隔符。

如果这是一个更长脚本的子集,您将需要保存并重置 Applescript 的文本项分隔符,就像您在

replaceText
中所做的那样。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.